文章目录
- 模板文件
- 创建模板文件
- 模板配置
- 模板文件使用
- 变量的使用
- 过滤器
- 模板标签
- `if` 标签
- `for` 标签
- `include` 标签
- `csrf_token` 标签
模板文件
上文中将数据和视图混在一起,这是不符合 Django 的理念的
创建模板文件
在 Django 中,模板被放在
templates
文件夹下,我们手动创建这个文件夹
并在其中创建一个文件
index.html
,写入
<h1>{{ hello }}</h1>
模板配置
同时也要在
setting.py
种配置。在字典
TEMPALTES
中
DIRS
元素中写入值
BASE_DIR + \'/templates\'
完成对于模板的配置
Django 会优先在配置的目录下寻找模板。如果无法找到模板,Dajngo 会去各应用的
templates
文件夹下寻找
模板文件使用
要在
view.py
中使用模板,需要导入
render()
函数
from django.shortcuts import render
事实上,
render()
函数的结构如下
def render(request,template_path,context={}):# 1.加载模板文件,获取一个模板对象temp = loader.get_template(template_path)# 2.定义模板上下文,给模板传递数据context = RequestContext(request, context)# 3.模板渲染,产生一个替换后的html内容res_html = temp.render(context)# 4.返回应答return HttpResponse(res_html)
我们在
MyApp\\view.py
中写入
def hello(request):context = {}context[\'hello\'] = \'Hello World\'return render(request, \'index.html\', context)
则网页
https:\\\\localhost:8000\\MyApp\\
就会有相应的显示
模板语法
变量的使用
在模板中,我们用
{{}}
来使用变量。而在视图的
render()
函数中,
context
参数用于传递变量的数据。
context
是一个字典,其元素的键是模板中的变量名,元素的值是模板中变量的值
过滤器
在变量后使用管道符号
|
可以在被显示前用过滤器操作变量的值,其格式为
{{ variable|filter:filter_parameters }}
并且过滤器可以顺序链接使用
具体有哪些过滤器可以查看官方过滤器文档
常用的过滤器有
lower, upper, truncatewords, addslaches, date, length, default, filesizeformat, safe
等
模板标签
if
标签
其主要结构为
{% if condition1 %}{% elif condition2 %}{% else %}{% endif %}
for
标签
for
循环的主要结构为
{% for athlete in athlete_list %}{% empty %}{% endfor %}
在
{% for %}
标签里可以通过
{{forloop}}
变量获取循环序号。
-
forloop.counter
: 顺序获取循环序号,从 1 开始计算
-
forloop.counter0
: 顺序获取循环序号,从 0 开始计算
-
forloop.revcounter
: 倒叙获取循环序号,结尾序号为 1
-
forloop.revcounter0
: 倒叙获取循环序号,结尾序号为 0
-
forloop.first
(一般配合if标签使用): 第一条数据返回 True,其他数据返回 False
-
forloop.last
(一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False
include
标签
{% include %}
标签允许在模板中包含其它的模板的内容。
{% include \"nav.html\" %}
csrf_token
标签
csrf_token
用于form表单中,作用是跨站请求伪造保护。
如果不用
{% csrf_token %}
标签,在用 form 表单时,要再次跳转页面会报403权限错误。
用了
{% csrf_token %}
标签,在 form 表单提交数据时,才会成功。
解析:
首先,向浏览器发送请求,获取登录页面,此时中间件 csrf 会自动生成一个隐藏input标签,该标签里的 value 属性的值是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。
然后,等用户需要用到form表单提交数据的时候,会携带这个 input 标签一起提交给中间件 csrf,原因是 form 表单提交数据时,会包括所有的 input 标签,中间件 csrf 接收到数据时,会判断,这个随机字符串是不是第一次它发给用户的那个,如果是,则数据提交成功,如果不是,则返回403权限错误。
自定义标签和过滤器
在根目录下创建
templatetags
目录,并在
templatetags
目录下创建任意
.py
文件,例如
my_tags.py
,其代码如下
from django import templateregister = template.Library() #register的名字是固定的,不可改变
修改
settings.py
文件的
TEMPLATES
选项配置,添加
libraries
配置:
TEMPLATES = [{\'BACKEND\': \'django.template.backends.django.DjangoTemplates\',\'DIRS\': [BASE_DIR+\"/templates\",],\'APP_DIRS\': True,\'OPTIONS\': {\'context_processors\': [\'django.template.context_processors.debug\',\'django.template.context_processors.request\',\'django.contrib.auth.context_processors.auth\',\'django.contrib.messages.context_processors.messages\',],\"libraries\":{ # 添加这边三行配置\'my_tags\':\'templatetags.my_tags\' # 添加这边三行配置} # 添加这边三行配置},},]
利用装饰器
@register.filter
自定义过滤器。
注意:装饰器的参数最多只能有 2 个。
@register.filterdef my_filter(v1, v2):return v1 * v2
5、利用装饰器
@register.simple_tag
自定义标签。
@register.simple_tagdef my_tag1(v1, v2, v3):return v1 * v2 * v3
6、在使用自定义标签和过滤器前,要在 html 文件 body 的最上方中导入该 py 文件。
{% load my_tags %}
7、在 HTML 中使用自定义过滤器。
{{ 11|my_filter:22 }}
8、在 HTML 中使用自定义标签。
{% my_tag1 11 22 33 %}
9、语义化标签
在该 py 文件中导入
mark_safe
。
from django.utils.safestring import mark_safe
定义标签时,用上 mark_safe 方法,令标签语义化,相当于 jQuery 中的 html() 方法。
和前端HTML文件中的过滤器 safe 效果一样。
@register.simple_tagdef my_html(v1, v2):temp_html = \"<input type=\'text\' id=\'%s\' class=\'%s\' />\" %(v1, v2)return mark_safe(temp_html)
在HTML中使用该自定义标签,在页面中动态创建标签。
{% my_html \"zzz\" \"xxx\" %}
静态文件
在根目录下创建
static
文件夹用于存储静态文件(如css样式文件,js执行文件以及一些图片、声音、视频等)
在项目创建时就会自动完成
static
的配置,此处无需再配置
模板的继承
模板继承
模板可以用继承的方式来实现复用,减少冗余内容。
网页的头部和尾部内容一般都是一致的,我们就可以通过模板继承来实现复用。
父模板用于放置可重复利用的内容,子模板继承父模板的内容,并放置自己的内容。
父模板
标签 block…endblock: 父模板中的预留区域,该区域留给子模板填充差异性的内容,不同预留区域名字不能相同。
{% block 名称 %}
预留给子模板的区域,可以设置设置默认内容
{% endblock 名称 %}
子模板
子模板使用标签 extends 继承父模板:
{% extends “父模板路径”%}
子模板如果没有设置父模板预留区域的内容,则使用在父模板设置的默认内容,当然也可以都不设置,就为空。
子模板设置父模板预留区域的内容:
{ % block 名称 % }
内容
{% endblock 名称 %}
接下来我们先创建之前项目的 templates 目录中添加 base.html 文件,代码如下:
HelloWorld/templates/base.html 文件代码:
菜鸟教程(runoob.com)
Hello World!
菜鸟教程 Django 测试。
{% block mainbody %}
original
{% endblock %}以上代码中,名为 mainbody 的 block 标签是可以被继承者们替换掉的部分。
所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。
runoob.html 中继承 base.html,并替换特定 block,runoob.html 修改后的代码如下:
HelloWorld/templates/runoob.html 文件代码:
{%extends “base.html” %}
{% block mainbody %}
继承了 base.html 文件
{% endblock %}第一行代码说明 runoob.html 继承了 base.html 文件。可以看到,这里相同名字的 block 标签用以替换 base.html 的相应 block。
重新访问地址 http://127.0.0.1:8000/runoob,输出结果如下:
爱站程序员基地


