Django | 四、模板
文章目录
模板文件
上文中将数据和视图混在一起,这是不符合 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
: 倒叙获取循环序号,结尾序号为 1forloop.revcounter0
: 倒叙获取循环序号,结尾序号为 0forloop.first
(一般配合if标签使用): 第一条数据返回 True,其他数据返回 Falseforloop.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 template register = 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.filter def my_filter(v1, v2): return v1 * v2
5、利用装饰器
@register.simple_tag自定义标签。
@register.simple_tag def 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_tag def 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,输出结果如下:
- django 模板语法和三种返回方式
- Django 模型数据的模板呈现
- [py]django模板继承
- Django-模板语言和过滤器
- django模板的使用
- Django1.4关于静态文件(css.js等)和模板路径的配置
- django中模板(html)以及静态文件(css,js,images)的配置
- django传值给模板, 再用JS接收并进行操作的实例
- Django和Flask模板创建的对比以及查询语句的不同
- Django模板的include机制
- django的html模板中获取字典的值
- Django框架提升(3)~模板
- Django 模板目录配置
- Django学习(1)-继承模板
- 解决Django模板无法使用perms变量问题的方法
- python web框架Django学习(五)模板中的循环,条件判断,常用的标签,过滤器的使用
- [Django模板系统]Non-ASCII character 'xe5' in file报错问题
- django模板中关于过滤器的使用
- Django 模板中使用if标签进行数据比较问题
- 08.Django自定义模板,自定义标签和自定义过滤器