模板:
模板用于快速生成动态页面返回给客户端,模板是一个文本,用于分离文档的表现形式和内容。
1.模板的渲染
- render加载和渲染同时进行:
from django.shortcuts import render
render(request, templatesname, context=None)
# 参数
# request:请求对象,templatesname:模板名称, context:参数字典,必须是字典
2.变量
变量在模板中的表示为:{{变量名}},变量名就是render中context中的键,变量可以是数值、字符串、布尔、也可以是字典、对象、列表等
- 列表、元组:元素可以使用索引引用,不能使用负索引(变量.索引)
- 字典:字典变量.key
- 对象:对象.属性,对象.方法名(方法不能有参数)
3.过滤器
过滤器是在变量显示之前修改它的值的一个方法,过滤器使用管道符,过滤器可以串联调用:{{变量|方法}}
常见的过滤器方法:
- default:如果该变量不知道或值为None时,显示缺省值{{ li|default:“缺省值” }}
- default_if_none:如果变量值为None时,显示缺省值;变量不存在就不显示任何值{{value|default_if_none:‘hello’ }}
- date:格式化日期字符串{{ t1|date:‘Y-d-d H-m-s’ }}
- 自定义过滤器
# 在app⾥创建⼀个包:templatetags,在包⾥创建⼀个py⽂件 eg:mytag.py
from django import template
# 建立模板对象
register = template.Library() # 实例化自定义过滤器对象
@register.filter(name='sub1') # name代表模板在使用的过滤器的名称
def sun(value): # 参数不能多于两个
return value - 1
# 在模板中使用
{% load mytag %} #加载⾃定义过滤器的模块
<p>
{{ 5|sub1 }}
</p>
# 显示结果为:4
4.内嵌标签
语法:{% tag %}
4.1 if标签
{% if express1 %}
# to do
{% elif express2 %}
# to do
{% else %}
# to do
{% endif %}
支持的运算符
- <、>=、 <=、 ==、 !=、 in、 not in、 is、 is not、 not、 and、 or
4.2 for
遍历可迭代对象
{% for x in y %}
...
{% endfor %}
# 反向迭代(reversed)
{% for value in c [1,2,3,4,5] reversed %}
<span>{{ value }}---</span>
{% endfor %}
# empty 当可迭代对象为空或不存在时执⾏,否则不执⾏
{% for value in c %}
<span>{{ value }}---</span>
{% empty %}
数据不存在
{% endfor %}
# 字典迭代
# e = {'a1':20,'b1':40}
{% for k,v in e.items %}
<div>{{ k }}---{{ v }}</div>
{% endfor %}
# 获取for循环迭代的状态
# forloop.parentloop 获取上层的迭代对象
{% for i in c %}
<li>{{ forloop.first }}</li> # forloop.first 是否为第⼀次迭代
<li>{{ forloop.last }}</li> # forloop.last 是否为最后⼀次迭代
<li>{{ forloop.counter }}</li> # forloop.counter 获取迭代的索引 从1开始
<li>{{ forloop.counter0 }}</li> # forloop.counter0 获取迭代的索引 从0开始
<li>{{ forloop.revcounter }}</li> # forloop.revcounter 迭代的索引从最⼤递减到1
<li>{{ forloop.revcounter0 }}</li> # forloop.revcounter0 迭代的索引从最⼤递减到0
{% endfor %}
4.3 ifequal/ifnotequal
⽤于判断两个值相等或不等的
{% ifequal var var %}
{% endifequal %}
{% ifnotequal var var %}
{% endifnotequal %}
5、 跨站请求伪造 csrf
防⽌⽹站受第三⽅服务器的恶意攻击(确定表单到底是不是本⽹站的表单传递过来的)。csrf相当于在表达中增加了⼀个隐藏的input框,⽤于向服务器提交⼀个唯⼀的随机字符串⽤于服务器验证表单是否是本服务器的表单。
# 在表单中添加
{% csrf_token %}
局部禁⽤csrf
#在不想检验csrf的视图函数前添加装饰器 @csrf_exempt。
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def csrf1(request):
pass
6、模板导入标签(include)
可以把指定html文件代码导入到当前文件,实现模板代码的复用。
{% include '路径'/xxx.html' %}
7、url标签
在模板中url标签可用于反向解析
<h2><a href="{% url 'App:index' %}">动态⽣成路由地址不带参的跳转</a></h2>
<h2><a href="{% url 'App:args1' 1 2 %}">动态⽣成路由地址带参的跳转</a></h2>
<h2><a href="{% url 'App:args1' num1=1 num2=2 %}">动态⽣成路由地址带关键字参数的跳转</a></h2>
8、模板继承
模板继承就是先构造一个基础框架模板,而后在其子模版中对它所包含站点的公用部分和定义块进行重载
- {% extents %} 继承父模板
- {% block %} 子模版可以重载这个部分
- {{ block.super }} 调用父模板的代码
使用继承的常见方式 - 创建base.html模板,在其中定义站点的主要外观感受。这些都是不常修改甚⾄从不修改的部分。
- 为每种类型的⻚⾯创建独⽴的模板,例如论坛⻚⾯或者图⽚库。这些模板拓展相应的区域模板.
- 自己的⻚⾯继承⾃模板,覆盖⽗模板中指定block
9、静态资源配置
- 创建static文件夹
- 在settings中注册
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
- 在模板中使用静态资源
{% load static %} #放置到模板开头
<img src="/static/img/img.jpeg" alt=""> #硬编码
<img src="{% static 'img/img.jpeg' %}" alt=""> #动态写法,建议⽤这种