- 注释标签
- Django中注释使用
{# #}
,例如
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> {# <h1>aaa</h1> #} <h1>test</h1> </body> </html>
- 访问
- include标签
{% include %}
标签允许在模板中包含其他模板的内容,例如:
- test.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <h1>test</h1> {% include "test_2.html" %} #调用test_2.html的内容 </body> </html> - test_2.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试_2</title> </head> <body> <h1>test_2</h1> </body> </html>
- 查看页面
- csrf_token
- csrf_token 用于form表单中,作用是跨站请求伪造保护
如果不用{% csrf_token %}标签,在用 form 表单时,要再次跳转页面会报 403 权限错误。
用了{% csrf_token %}标签,在 form 表单提交数据时,才会成功。
解析:
首先,向服务器发送请求,获取登录页面,此时中间件 csrf 会自动生成一个隐藏input标签,该标签里的 value 属性的值是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。
然后,等用户需要用到form表单提交数据的时候,会携带这个 input 标签一起提交给中间件 csrf,原因是 form 表单提交数据时,会包括所有的 input 标签,中间件 csrf 接收到数据时,会判断,这个随机字符串是不是第一次它发给用户的那个,如果是,则数据提交成功,如果不是,则返回403权限错误。
- 自定义标签和过滤器
- 下面是自定义标签和过滤器的过程:
(1)在helloworld的项目目录下创建目录templatetags
,与templates
目录同级,需要注意,目录名称必须是templatetags
(2)在templatetags
目录下创建任意的.py
文件,这里创建my_tags.py
(3)编写文件,写入:
#-*- coding: utf-8 -*- from django import template register = template.Library() #变量名称register是固定的,不能修改
(4)修改settings.py
文件的TEMPLATES
选项配置,添加libraries
配置:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(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' #添加 } #添加 }, }, ]
(5)利用装饰器@register.filter
自定义过滤器,利用装饰器@register.simple_tag
自定义标签
注意:装饰器的参数最多只能有2个
#-*- coding: utf-8 -*- from django import template register = template.Library() @register.filter #自定义过滤器 def my_filter(v1,v2): return v1 * v2 @register.simple_tag #自定义标签 def my_tag1(v1,v2,v3): return v1 * v2 * v3
(7)修改模板文件test.html,在body的最上方导入该.py文件,并且在文件中使用我们自定义的过滤器和标签
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> {% load my_tags %} #导入刚才编写的my_tags文件 </head> <body> {{ 11 | my_filter:22}} #使用自定义的过滤器和标签 {% my_tag1 11 22 33 %} </body> </html>
此时访问页面,发现我们自定义的过滤器和标签已经生效了
(8)创建语义化标签(语义化的标签,旨在让标签有自己的含义)
- 在创建的
my_tags.py
文件中导入mark_safe
并且进行修改
#-*- coding: utf-8 -*- from django import template from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag def my_html(v1,v2): temp_html = "<input type='test' id='%s' class='%s' />" %(v1,v2) return mark_safe(temp_html)
然后修改test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试</title> {% load my_tags %} </head> <body> {% my_html "aaa" "bbb" %} </body> </html>
- 访问页面
- 配置静态文件
- 这节需要下载图片、bootstrap框架、css页面等,可以去看原文
- 大致步骤:
- 在项目根目录下创建
static
目录
- 在
settings.py
文件最后添加配置:
STATIC_URL = '/static/' #别名 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "statics"), #指定目录 ]
在static目录下创建css、js、images、plugins目录,分别存放css文件、js文件、图片、插件
把bootstrap框架放入插件目录plugins
在HTML文件的head标签中引擎框架bootstrap
编写模板,模板中加入{% load static %}代码
- 模板继承
- 模板可以使用继承的方式实现复用,减少冗余内容
- 网页的头部、尾部内容一般都是一致的,这种情况下就可以通过模板继承来实现复用
- 父模板用于放置可重复利用的内容,子模板继承父模板的内容,并且放置自己的内容
1、父模板
- 标签
{% block %}
,这是父模板中的预留区域,该区域留给子模版填充差异性的内容,不同预留区域名称不能相同,例如:
{% block 名称 %} 预留给子模板的区域,可以设置设置默认内容 {% endblock 名称 %}
2、子模版
- 子模板使用标签
extends
去继承父模板,例如:
{% extends %}
- 子模版如果没有设置父模板预留区域的内容,则使用在父模板设置的默认内容,也可以什么都不设置,为空
- 下面来看案例:
#编写父模板test_2.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>父页面</title> </head> <body> <h1>Hello World!</h1> <p>案例</p> {% block test %} #名称为test <p>测试测试!!!</p> #中间的内容就是子模板可以替换的部分 {% endblock %} </body> </html> #编写子模版test.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>子页面</title> </head> <body> {%extends "test_2.html" %} {% block test %} #这里的名称要和父模板名称对应 <p>继承test_2.html文件</p> {% endblock %} </body> </html>
- 访问页面,可以看到被替换了
- 修改子模板,删除
{% block %}
的内容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>子页面</title> </head> <body> {%extends "test_2.html" %} </body> </html>
- 再次访问,发现页面完全变成了
test_2.html
的页面