Python3 Django的Templates详解

Python3 Django的Templates详解


本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/Rozol/article/details/79526459


以下代码以Python3.6.1为例
Less is more!
Python 3.6.1
Django 2.0.2
项目名: Django_templates 应用名: booktest

简介

  • Django提供模板, 用于生成动态HTML
  • 模板用于表达外观, 而非程序逻辑
  • 模板目录设置:
    • templates目录创建位置
      • 便于移植: 应用目录下 √
      • 不打算移植: 项目目录下
    • setting.py中修改'DIRS': [os.path.join(BASE_DIR, "booktest.templates"),]
  • 使用模板:

    def index(request):
        # 加载: 找到模板, 编译存于内存中
        tem = loader.get_template('index.html')
        context = {}
        # 渲染: 将context数据插到模板中
        return HttpResponse(tem.render(context, request))
    
        # render 简写
        # return render(request, 'index.html')

模板语言DTL

  • 变量

    • 计算变量, 并将其输出
    • 变量不存在, 输出空字符串
    • 语法: {{ variable }}
      • 属性/方法: bookinfo.name
  • 标签

    <h2>for标签h2>
    {% for book in books %}
        {#-循环逻辑-#}
    {{ forloop.counter }} {#-第几次循环-#}
        {{ book.name }}<hr>
    {% empty %}
        {#-列表为空或不存在, 执行此处-#}
        此列表为空
    {% endfor %} {#-循环结束-#}
    
    
    <h2>if标签h2>
    {% for book in books %}
        {%if book.name == '88888' %}
            {#-判断逻辑1-#}
            <text style="color:red">{{ book.name }}text>
        {% elif book.name == '红豆生南国' %}
            {#-判断逻辑2-#}
            <text style="color:blue">{{ book.name }}text>
        {% else %}
            {#-判断逻辑3-#}
            name未知
        {% endif %} {#-判断结束-#}
    {% endfor %}
    
    
    <h2>include:加载模板h2>
    {# 语法: include "html页" with 变量名=值 #}
    {% include "variable.html" with book=books|first %}
    
    
    <h2>url:反向解析h2>
    {% comment %}
    语法: url 'namespace:name'
    1. 在应用urls.py下配置 app_name = 'booktest'
    2. 在项目urls.py的path下配置 namespace. 例如:path('booktest/', include('booktest.urls', namespace='booktest'))
    3. 在应用urls.py的path下配置 name. 例如: path('', views.index, name='index'),
    {% endcomment %}
    <a href="{% url 'booktest:urltest' 'par1' 'par2' %}">反向解析a>
  • 过滤器

    • 语法: {{ 变量|过滤器}}
      • {{ name|lower }}
    • 使用示范:

      结合运算符:
      {% if list|length > 1 %}
          {{ list|length }}
      {% endif %}
      <br>
      
      串联调用:
      {{ string|lower|upper }}
      <br>
      
      传递参数:
      {{ string|join:'-' }}
      
      <br>
      默认值:
      {{ value|default:'默认值' }}
  • 注释

    单行注释:
    {# 单行注释 #}
    多行注释:
    {% comment %}
        多
        行
        注
        释
    {% endcomment %}
    

模板继承

  • 模板: 父模板, 子模板, 子模板继承父模板
  • 父模板的变量被子模板继承后, 子模板可使用它
  • block标签:
    • 语法: {% block blockname %} … {% endblock blockname %}
    • 父模板中: 在父模板中预留位置, 用于子模板填充
    • 子模板中: 在子模板中填充父模板
  • extentds标签:

    • 语法: {% extends “父html页” %}
    • 继承, 写在模板文件第一行
  • 使用案例:

    
    # --- 父模板页 ---
    
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
    head>
    <body>
    <h1>页头 {{ name }}h1>
    <hr>
    父模板:
    
    {# 在此预留位置, 用于子模板填充 #}
    {% block content %}
    <h1>abch1>
    {% endblock content %}
    
    <hr>
    <h1>页尾h1>
    body>
    html>
    
    
    # --- 子模板页 ---
    
    {% extends "base.html" %}
    
    子模板页面:
    这里写的文字无效
    
    将此块内容填充到父模板中 (注blockname相同)
    {% block content %}
    <h1>123h1>
    {% endblock content %}

html转义

  • Django只转义指定子集: < (<) / > (>) / ' (') / " (") / & (&)
  • 默认转义 (默认可执行代码转义成普通代码)

    • return render(request, 'escape.html', {'h1': '

      hello word

      '})
    • 输出:

      hello word

    • 转义过滤器(一般不写): |escape

      {{ h1|safe }}
      
  • 关闭转义

    • 不转义过滤器: |safe
    • 不转义标签(代码块):

      • autoescape标签, on转义, off不转义
      • {% autoescape off%} … {% endautoescape %}

        {% autoescape off %}
            {{ h1 }}
        {% endautoescape %}
        

csrf跨站请求伪造

  • 跨站请求伪造保护

    • 用于本站post请求表单, 拒绝非本站提交的表单
    • 使用:

      <form method="post" action="basetest">
          {% csrf_token %}
          <input name="name"><br>
          <input type="submit" value="提交"/>
      form>
      • 原理:
      • 只是生成了 该代码
      • 所以, 只是心理安慰而已 -_-!

你可能感兴趣的:(Python,python3,django2,templates)