文章目录
- 一、使用Django模板修改页面
- 二、Django模板标签
- - 变量
- - 列表
- - 字典
- - 过滤器
- 1、default
- 2、length
- 3、filesizeformat
- 4、date
- 5、truncatechars
- 6、safe
- - if/else标签
- - for标签
- - ifequal/ifnotequal标签
- - 注释标签
- - include标签
- - csrf_token
- - 自定义标签和过滤器
- - 配置静态文件
- - 模板继承
-
此文章参考菜鸟教程:Django 模板 | 菜鸟教程 (runoob.com)
Django版本:
>>> django.VERSION
(4, 1, 0, 'final', 0)
PS:基于前几章的进度进行修改
一、使用Django模板修改页面
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello World!!!")
<h1>{{ hello }}</h1> #这里是变量,使用了双括号
- 下面向Django说明模板文件路径,修改helloworld容器目录下的
settings.py
文件:
import os
。。。。。。
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',
],
},
},
]
- 现在修改
index_test.py
和urls.py
,增加一个新的对象,用于向模板提交数据
render()方法参数:
render(request, template_name, context=None, content_type=None, status=None, using=None)
request
:必要参数,浏览器向服务器发送的请求对象,包含用户信息、请求内容、请求方式等template_name
:必要参数,设置模板文件名,用于生成网页内容context
:对模板上下文即模板变量赋值,以字典格式表示,默认情况下是一个空字典content_type
:响应内容的数据格式,一般情况下使用默认值即可status
:HTTP状态码,默认是200using
:设置模板引擎,用于解析模板文件、生成网页内容等
- index_test.py
from django.shortcuts import render
def hello(request):
contest = {}
contest['hello'] = 'Hello World!!!'
return render(request,'test.html',contest)
- urls.py
from django.urls import path
from . import index_test
urlpatterns = [
path('hello/',index_test.hello),
]
二、Django模板标签
- 经过上面的实践,下面来看一下Django模板中常用的语法规则
- 变量
视图view:{"HTML变量名":"views变量名"}
HTML:{{ 变量名 }}
-
可以看到其实也就是字典,跟上面那个一样
-
下面来看案例:
- 现在修改视图文件
index_test.py
文件,下面是变量和字典的写法,可以看到思路其实是一样的:
- 变量
from django.shortcuts import render
def Hello(request):
test_view = "测试"
hello_view = "你好"
return render(request,'test.html',{"test":test_view,"hello":hello_view})
- 修改templates目录下的
test.html
文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title> #页面名称
</head>
<body>
<p>{{ test }}</p> #导入两个变量
<h1>{{ hello }}</h1>
</body>
</html>
- 列表
- 字典
- 过滤器
{{ 变量名 | 过滤器:可选参数 }}
- 模板过滤器可以在变量被显示前修改它,过滤器使用管道字符:
{{ name | lower }}
- 过滤管道可以被
套接
,也就是说一个过滤器的输出可以作为下一个过滤器的输入,与linux的管道符是一样的
{{ my_list | first | upper }}
- 有些过滤器有参数,过滤器的参数跟随冒号
:
之后并且总是以双引号""
包含
{{ bio | truncatewords:"30" }}
-
其他过滤器
addslashes
:添加反斜杠到任何反斜杠、单引号或者双引号前面date
:按照指定的格式字符串参数格式化date或者datetime对象
{{ pub_date | date:"F J, Y"}}
1、default
2、length
3、filesizeformat
4、date
5、truncatechars
6、safe
-
Django 会自动对视图文件传到HTML文件中的标签语法进行转义,令其语义失效
。而加 safe 过滤器是告诉 Django 该数据是安全的,不必对其进行转义,可以让该数据语义生效。
-
safe会将字符串标记为安全,不需要转移,但是需要保证视图文件传过来的数据是绝对安全,才能使用safe
-
safe和后端视图文件的mark_safe效果相同
-
下面来看案例
from django.shortcuts import render
def hello(request):
test_view = "<a href='https://www.baidu.com/'>点击跳转</a>"
return render(request,"test.html",{"test":test_view})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<p>{{ test }}</p>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<p>{{ test | safe }}</p>
</body>
</html>
- if/else标签
{% if condition %}
... display
{% endif %}
或
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
- for标签
- ifequal/ifnotequal标签
{% ifequal %}
标签可以比较两个值,当比较结果相等时,会显示在{% ifequal %}
和{% endifequal %}
之中所有的值,下面来看案例:
{% ifequal {{ user }} {{ currentuser }} %}
<h1>Welcome!</h1>
{% endifequal %}
- 和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:
{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% else %}
<h1>No News Here</h1>
{% endifequal %}
- 注释标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
{
<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" %}
</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)编写文件,写入:
from django import template
register = template.Library()
(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个
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 %}
</head>
<body>
{{ 11 | my_filter:22}}
{% my_tag1 11 22 33 %}
</body>
</html>
此时访问页面,发现我们自定义的过滤器和标签已经生效了
(8)创建语义化标签(语义化的标签,旨在让标签有自己的含义)
- 在创建的
my_tags.py
文件中导入mark_safe
并且进行修改
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)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
{% load my_tags %}
</head>
<body>
{% my_html "aaa" "bbb" %}
</body>
</html>
- 配置静态文件
- 在项目根目录下创建
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 %}
- 子模版如果没有设置父模板预留区域的内容,则使用在父模板设置的默认内容,也可以什么都不设置,为空
- 下面来看案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父页面</title>
</head>
<body>
<h1>Hello World!</h1>
<p>案例</p>
{% block test %}
<p>测试测试!!!</p>
{% endblock %}
</body>
</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>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>子页面</title>
</head>
<body>
{%extends "test_2.html" %}
</body>
</html>
- 再次访问,发现页面完全变成了
test_2.html
的页面
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)