接外包,有相关需求的可以联系我:Telegram | Email

Django templates

该文章创建(更新)于06/2/2022,请注意文章的时效性!

模板

定义模板

变量

  • 视图传递给模板的数据
  • 遵循标识符命名规则
  • 语法:{{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的一种方式。


👇 Share | 分享 👇


要不赞赏一下?

微信
支付宝
PayPal
Bitcoin

版权声明 | Copyright

除非特别说明,本博客所有作品均采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。转载请注明转自-
https://www.emperinter.info/2022/06/02/django-templates/


要不聊聊?

我相信你准备留下的内容是经过思考的!【勾选防爬虫,未勾选无法留言】

*

*



微信公众号

👉 NewsLetter ❤️ 邮箱订阅 👈

优惠码