Django4.2_templates之各种标签的用法讲解
admin
2023-02-14 10:00:04
0

四.模板之标签tag
在django中所有的标签均是通过{% %}来使用。
1.If...elif..else

{% if person.age > 20 %}
    {% if person.age < 30 %}
        

{{ person.name }}的年龄大于20小于30

{% elif person.age < 40 %}

{{ person.name }}的年龄小于40

{% else %}

{{ person.name }}的年龄大于等于40

{% endif %} {% elif person.age <= 20 and person.age > 10 %}

{{ person.name }}的年龄大于10小于等于20

{% else %}

{{ person.name }}的年龄大于等于10

{% endif %}

if必须要用{% endif%}来进行结束,if同样可以使用嵌套的用法。
2.for循环

{#for循环控制语句#}
 

list类型的for循环,{{ list1 }}

{% for i in list1 %} {#

{{ i }}

{# 此处遍历得到的是元素 #} {#

第{{ forloop.counter }}个元素是:{{ i }}

{# forloop.counter默认从1开始顺序计数 #} {#

第{{ forloop.counter0 }}个元素是:{{ i }}

{# forloop.counter0 是从0开始顺序计数 #} {#

倒数第{{ forloop.revcounter }}个元素是:{{ i }}

{# forloop.revcounter倒数进行计数,最小值默认是1 #}

倒数第{{ forloop.revcounter0 }}个元素是:{{ i }}

{# forloop.revcounter0倒数进行计数,最小值默认是0 #} {# 注:不管是顺序计数的forloop.counter或forloop.counter0还是逆序计数的forloop.revcounter或forloop.revcounter0;改变的只是计算的初始值而已#} {% endfor %}

tuple类型的for循环,{{ tuple1 }}

{% for t in tuple1 %}

第{{ forloop.counter }}个元素是:{{ t }}

{% endfor %}

dict类型的for循环,{{ data }}

{% for t in data %}

第{{ forloop.counter }}个字典的key值是:{{ t }}

{# 字典循环得到的是key #} {% endfor %}

str类型的for循环,{{ str1 }}

{% for s in str1 %}

第{{ forloop.counter }}个元素是:{{ s }}

{% endfor %} {# #}

forloop.first的用法,list2='{{ list2 }}'

{% for s in list2 %} {# {% if forloop.first %} {# forloop.first 结果返回布尔值 #} {#

第1个元素不为False,它是:{{ s }}

#} {# {% endif %}#} {#

第{{ forloop.counter }}个元素是:{{ s }}

#} {% empty %}

第{{ forloop.counter }}个元素为空

{% endfor %}

总结:在django模板中的for循环语句和if条件判断语句,都要用对应的endfor和endif来作为结束的标志。且,模板中的变量使用两个括号{{ varname }}而模板中的标签语句时用一个括号和百分号组合进行使用的{% tag语句 %}。

3.{% csrf_token %}
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

CSRF预防机制
CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。
token防御的整体思路是:
第1步:后端随机产生一个token,把这个token保存在SESSION状态中;同时,后端把这个token交给前端页面;
第2步:下次前端需要发起请求(比如发帖)的时候把这个token加入到请求数据或者头信息中,一起传给后端;
第3步:后端校验前端请求带过来的token和SESSION里的token是否一致;
Django下的CSRF预防机制
django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,
这样就能避免被 CSRF ***。
在 templete 中, 为每个 POST form 增加一个 {% csrf_token %} tag. 如下: 
1.在返回的 HTTP 响应的 cookie 里,django 会为你添加一个     csrftoken 字段,其值为一个自动生成的 token
2.在所有的 POST 表单模板中,加一个{% csrf_token %} 标签,它的功能其实是给form增加一个隐藏的input标签,如下
,而这个csrf_token = cookie.csrftoken,在渲染模板时context中有context['csrf_token']=request.COOKIES['csrftoken']
3.在通过表单发送POST到服务器时,表单中包含了上面隐藏了crsrmiddlewaretoken这个input项,服务端收到后,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf ***,返回 403 Forbidden.
4.在通过 ajax 发送POST请求到服务器时,要求增加一个x-csrftoken header,其值为 cookie 里的 csrftoken 的值,服务湍收到后,django会验证这个请求的cookie里的csrftoken字段与ajax post消息头中的x-csrftoken header是否相同,如果相同,则表明是一个合法的请求
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
1、原理
  在客户端页面上添加csrftoken, 服务器端进行验证,服务器端验证的工作通过'django.middleware.csrf.CsrfViewMiddleware'这个中间层来完成。在django当中防御csrf***的方式有两种:
   1.在表单当中附加csrftoken
   2.通过request请求中添加X-CSRFToken请求头。
注意:Django默认对所有的POST请求都进行csrftoken验证,若验证失败则403错误侍候。

如下图,前端不带csrf_token时:
Django4.2_templates之各种标签的用法讲解

Django4.2_templates之各种标签的用法讲解
下图开始带csrf_token:
Django4.2_templates之各种标签的用法讲解
4.{% url '引用的url地址' %}
主要是在进行url别名时的使用,先在url中为该url设置别名,这样其他地方需要引用该地址时就可以直接使用别名即可。如图:
Django4.2_templates之各种标签的用法讲解

Django4.2_templates之各种标签的用法讲解
5.{% with %}
with是将变量进行重命名(主要是将view中直接传来的复杂变量名进行简写,只能是view中现有的变量,不能是再进一步获取的变量.例如该例子中可以是view中的person,却不能是person.name。且必须要以{% endwith %}作为结束。
Django4.2_templates之各种标签的用法讲解
Django4.2_templates之各种标签的用法讲解
Django4.2_templates之各种标签的用法讲解
注意:with中进行变量赋值时,等号前后不能有空格,否则将报错不是一个变量。
6.{% verbatim %}
作用:禁止render在前端浏览器渲染该部分的变量,类似于转义符’//’表示/一样的作用。{%verbatim%}也必须以{% endverbatim%}来作为结束。
如图,需要在浏览器上显示{{data}},而不是渲染出view中data变量值:
Django4.2_templates之各种标签的用法讲解
Django4.2_templates之各种标签的用法讲解
Django4.2_templates之各种标签的用法讲解
7.自定义标签
自定义标签的新建步骤参考自定义过滤器的步骤https://blog.51cto.com/10836356/2318602;
自定义标签和上一节中的自定义过滤器的定义方法完全相同,只是自定义标签的上方的装饰器不同而已。
自定义标签和自定义过滤器的区别:
A.自定义过滤器函数中只能定义一个变量(加上自身共2个变量),而自定义标签函数的变量个数可以任意多;
B.自定义过滤器是作用于变量的,所以在使用时一定是在{{a|filter}}中且与作用对象用’|’隔开;而自定义标签是使用在{% tagname pram1 pram2 ...%}
C.自定义标签局限性:不能用在if等tag语句中,而filter可以用在if等tag语句中,如图:
Django4.2_templates之各种标签的用法讲解
如下图所示,可以比较两者的使用方法和效果:
Django4.2_templates之各种标签的用法讲解

Django4.2_templates之各种标签的用法讲解

Django4.2_templates之各种标签的用法讲解

Django4.2_templates之各种标签的用法讲解

欢迎关注笔者个人公众号:
Django4.2_templates之各种标签的用法讲解

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...