Django templates

模板

定义模板

变量

  • 视图传递给模板的数据
  • 遵循标识符命名规则
  • 语法:{{var}}
  • 注意
    • 如果使用的变量不存在,则插入的是空字符串
  • 在模板中使用点(.)语法{{stu.name}}
    • 字典查询
    • 属性或者方法
    • 数字索引
  • 在模板中调用对象的方法
    • 注意:不能传递参数

标签

  • 语法:{% tag %}
  • 作用
    • 在输出中创建文本
    • 控制逻辑或循环
  • if
    • 语法
# way1
{% if 表达式 %}
语句
{% endif %}

# way2
{% if 表达式 %}
语句1
{% else %}
语句2
{% endif %}

#way3
{% if 表达式1 %}
语句1
{% elif 表达式2 %}
语句2
...
{% elif 表达式n %}
语句n
{% else %}
语句e
{% endif%}      
  • for
# way1
{% for var in 列表 %}
语句
{% endfor %}

# way2
{% for var in 列表 %}
语句
{% empty %}
语句2(列表为空或者列表不存在时执行语句2)
{% endfor %}

# 特殊var,表示第几次循环
{{forloop.counter}}
  • comment 注释多行
{% comment %}
注释内容
{% endcomment %}
  • ifequal/ifnotequal 判断是否相等或不相等
{% ifequal 值1 值2 %}
语句(如果值1等于值2则执行这个语句)
{% endifequal %}
  • include 加载模板并以标签内的参数渲染
{% include '模板目录' 参数1 参数2 %}
  • url 反向解析
{% url 'namespace:name' p1 p2%}
  • csrf_token 用于跨站请求伪造保护
{% csrf_token %}
  • block/extends 用于模板继承

  • autoescape 用于HTML转义

过滤器

  • 语法

{{ var|过滤器}}

  • 作用

在变量显示前修改它
lower
upper
– 过滤器可以传递参数,参数用引号引起来
join
– 格式:列表|join:"#"
– 例子:<p>{{list|join:"#"}}</p>
– 如果一个变量没有被引用,或者值为False/空,可以使用默认值defalut
– 格式:{{test|default:"没有"}}
– 示例:<p>{{test|default:"没有"}}</p>
– 根据指定格式转换日期为字符串
– 格式:{{ dateVal |date:"y-m-d"}}
– HTML转义escape
– 加减乘除

<h1>加减乘除</h1>  
<h1>{{ num }}</h1>  
<h1>{{ num|add:10 }}</h1>  
<h1>{{ num|add:-5 }}</h1>  
<!-- (num/1)*5    -->  
<h1>{% widthratio num 1 5 %}</h1>  
<!-- num/5    -->  
<h1>{% widthratio num 5 1 %}</h1>

注释

  • 单行注释
{# 注释的内容 #}
  • 多行注释 [[Django#^6b98ce]]]
{% comment %}
注释内容
{% endcomment %}

反向解析

  • 项目url配置
urlpatterns = [  
    path('admin/', admin.site.urls),  
    url(r'^', include(('myApp.urls',"myApp"),namespace='app')),  
]
  • application配置
urlpatterns = [
    url(r'^good/(\d+)$',views.good,name='good'),
]
  • html配置
<a href="{% url 'app:good' 2 %}">自动解析的方式-Good</a>

模板继承

作用

  • 可以减少页面内容的重复定义,实现页面的重用

block标签

  • 在父模板中预留区域,子模版去填充
  • 语法,content为自定义的名称
{% block content %}  
{% endblock %}

extends标签

  • 继承模板,需要写在模板文件的第一行
  • 语法
{% extends '父模板路径' %}

示例

  • 定义父模板
<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Title</title>  
    <style>        #header{  
            width: 100%;  
            height: 100px;  
            background-color: #red;  
            padding: 2em;  
            text-align: center;  
        }  
        #footer{  
            width: 100%;  
            height: 100px;  
            background-color: blue;  
            padding: 2em;  
            text-align: center;  
        }  
        #content{  
            width: 100%;  
            height: 500px;  
            background-color: yellow;  
            padding: 2em;  
            text-align: center;  
        }  
    </style>  
</head>  
<body>  
    <div id="header">header</div>  
    <div id="content">  
        {% block content %}  
        {% endblock %}  
        <hr>  
        {% block content2 %}  
        {% endblock %}  
    </div>  
    <div id="footer">footer</div>  
</body>  
</html>
  • 定义子模版
{% extends 'myApp/base.html' %}  

{% block content %}  
    <h1>detail!</h1>  
{% endblock %}  

{% block content2 %}  
    <h1>detail2!</h1>  
{% endblock %}

HTML转义

问题

  • 直接在view把html传到模板中会被当作字符串渲染

作用

  • 将接收到的字符串当作html代码渲染

方法

  • 过滤器safe
  • 标签autoescape 并启用off
{{code}}  
<hr>  
{{code|safe}}  
<hr>  
{% autoescape off %}  
{{code}}  
{% endautoescape %}

CSRF

跨站请求伪造

  • 某些恶意网站包含链接、表单、按钮利用登录用户在浏览器中进认证,并进行攻击。

防止CSRF

  • seetings.py中的MIDDLEWARE添加'django.middleware.csrf.CsrfViewMiddleware',
  • 在网页中加上
{% csrf_token %}

验证码

作用

  • 在用户注册,登陆页面的使用使用,为了防止暴力请求。
  • 防止CSRF的一种方式。

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *