Django06 - 模型层
一:前后端交互编码方式
1.urlencoded
form表单默认是urlencoded编码格式传输数据
数据格式:username=Darker&password=123456
django会将该格式的数据 自动解析并打包到request.POST
中
2.form-data
数据分为2部分:数据、文件
数据部分:username=Darker&password=123456
-----分隔-----
文件部分(二进制)
数据 自动解析并打包到request.POST
中
文件 自动解析并打包到request.FILES
中
3.json
django后端针对json格式数据 并不会做任何的处理,而是直接放在request.body
中
# request.body
{
"username": "Darker",
"password": "123456"
}
二:Django模板使用的2种方式
# 模板
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>{{ word }}</h1></div>
<div class="panel-body text-center">
<h1>{{ current_time }}</h1>
</div>
</div>
方式1
import datetime
def test(request):
now = datetime.datetime.now()
return render(request, 'test.html', context={'current_time': str(now), 'word': 'Hello World'})
方式2 - 页面静态化
import datetime
def test(request):
now=datetime.datetime.now()
from mysite import settings
import os
path=os.path.join(settings.BASE_DIR,'templates','test.html')
ss=open(path,'r',encoding='utf-8').read()
t=Template(ss)
c=Context({'current_date':str(now),'word': 'Hello World'})
html=t.render(c) # html是渲染后的字符串
return HttpResponse(html)now=datetime.datetime.now()
三:变量
DTL:Django Template Language(Django模板语言)
def test(request):
x_num = 666
x_str = 'Hello World'
x_bool = True
x_list = ['Nice', 'Beautiful', {'usr': 'root', 'pwd':123}, 7]
x_dict = {'name': 'Darker', 'age': 18, 'gender': 'male'}
x_set = {1, 2, 3, 4, 5}
x_tuple = (9, 8, 7, 6, 5)
def x_func():
print('I\'m function-print')
return 'I\'m function-return'
class X_Info(object):
def __init__(self, name):
self.name = name
def print_name(self):
return self.name
def __str__(self):
return self.name
x_obj = X_Info('Darker')
return render(request, 'test.html', locals()) # locals() 把当前作用域下所有的变量,都传到context中
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>变量</h1></div>
<div class="panel-body ">
<ul style="line-height: 30px;">
<li>Num:{{ x_num }}</li>
<li>Str:{{ x_str }}</li>
<li>Bool:{{ x_bool }}</li>
<li>List:{{ x_list }}</li>
<li>Dict:{{ x_dict }}</li>
<li>Set:{{ x_set }}</li>
<li>Tuple:{{ x_tuple }}</li>
<li>Function:{{ x_func }}</li>
<li>Class:{{ X_Info }}</li>
<li>Class_Obj:{{ x_obj }}</li>
</ul>
</div>
</div>
结论:
- 基本数据类型都可以传输
- 函数需要retuen
- 类无法传输,也无法打印内存地址
- 类实例化的对象可以传输,但是需要在类中定义
__str__
四:句点符查询
直接用.
来操作
# views.py
from django.utils.safestring import mark_safe
def test(request):
x_list = ['Nice', 'Beautiful', {'usr': 'root', 'pwd':123}, 7]
x_dict = {'name': 'Darker', 'age': 18, 'gender': 'male'}
x_set = {1, 2, 3, 4, 5}
x_tuple = (9, 8, 7, 6, 5)
x_link1 = '<a href="http://www.xuexianqi.top">Click Here</a>'
x_link2 = mark_safe(x_link1)
x_inp1 = '<br><input type="text" name="name">'
x_inp2 = mark_safe(x_inp1)
x_script1 = '<script>alert("弹窗警告!")</script>'
x_script2 = mark_safe(x_script1)
def x_func():
print('I\'m function-print')
return 'I\'m function-return'
class X_Info(object):
def __init__(self, name):
self.name = name
def print_name(self):
return self.name
def __str__(self):
return self.name
x_obj = X_Info('Darker')
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>变量</h1></div>
<div class="panel-body ">
<ul style="line-height: 30px;">
<li>列表的第2个元素:{{ x_list.1 }}</li>
<li>列表第3个元素的值:{{ x_list.2.usr }}</li>
<li>字典中name的值:{{ x_dict.name }}</li>
<li>集合的第4个元素:{{ x_set.3 }}</li>
<li>元组的第5个元素:{{ x_tuple.4 }}</li>
<li>执行函数x_func:{{ x_func }}</li>
<li>调用对象x_obj的方法:{{ x_obj.print_name }}</li>
<li>调用对象x_obj的属性:{{ x_obj.name }}</li>
<li>a标签字符串1:{{ x_link1 }}</li>
<li>a标签字符串2:{{ x_link2 }}</li>
<li>输入框1:{{ x_inp1 }}</li>
<li>弹窗警告1:{{ x_script1 }}</li>
<li>弹窗警告2:{{ x_script2 }}</li>
</ul>
</div>
</div>
结论:
- 列表、元组、集合 可以
.索引
取值- 集合无法
.索引
取值,因为集合是无序的- 字典取值直接
.
,而不是.get()
或者[]
- 函数和类可以
.
属性和方法来执行- 被
mark_safe()
包裹的标签 被认为是安全的,可以被渲染mark_safe()
需要导入:from django.utils.safestring import mark_safe
五:过滤器
语法:{{obj|filter__name:param}} 变量名字|过滤器名称:变量
default - 设置默认值
如果一个变量是false
或者为空
,使用给定的默认值。否则,使用变量的值。
语法:{{ value|default:"nothing" }}
# views.py
def test(request):
x_num0 = 0
x_num1 = 1
x_bool_t = True
x_bool_f = False
x_emp_dic = {}
x_emp_list = []
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>default</h1></div>
<div class="panel-body ">
<ul style="line-height: 30px;">
<li>x_num0:{{ x_num0|default:"我是默认值" }}</li>
<li>x_num1:{{ x_num1|default:"我是默认值" }}</li>
<li>x_bool_t:{{ x_bool_t|default:"我是默认值" }}</li>
<li>x_bool_f:{{ x_bool_f|default:"我是默认值" }}</li>
<li>x_emp_dic:{{ x_emp_dic|default:"我是默认值" }}</li>
<li>x_emp_list:{{ x_emp_list|default:"我是默认值" }}</li>
</ul>
</div>
</div>
结论:
- bool值为
False
,使用默认值数值为0
,使用默认值空列表
,使用默认值空字典
,使用默认值- 其余全部使用变量原来的值
length - 返回长度
返回值的长度,对可迭代对象有效
# views.py
def test(request):
x_num = 666
x_str = 'Hello World'
x_bool = True
x_list = ['Nice', 'Beautiful', {'usr': 'root', 'pwd': 123}, 7]
x_dict = {'name': 'Darker', 'age': 18, 'gender': 'male'}
x_set = {1, 2, 3, 4, 5}
x_tuple = (9, 8, 7, 6, 5)
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>default</h1></div>
<div class="panel-body ">
<ul style="line-height: 30px;">
<li>x_num:{{ x_num|length }}</li>
<li>x_str:{{ x_str|length }}</li>
<li>x_bool:{{ x_bool|length }}</li>
<li>x_list:{{ x_list|length }}</li>
<li>x_dict:{{ x_dict|length }}</li>
<li>x_set:{{ x_set|length }}</li>
<li>x_tuple:{{ x_tuple|length }}</li>
</ul>
</div>
</div>
结论:
- 数字、布尔类型 不能计算长度
- 列表、字典、元组、集合、字符串 都可以计算长度
filesizeformat - 返回大小
将值格式化为一个人类可读的文件尺寸
# views.py
def test(request):
x_num1 = 1
x_num2 = 8
x_num3 = 1024
x_num4 = 1024*10
x_num5 = 1024**2
x_num6 = 1024**3
x_num7 = 1024**4
x_num8 = 1024**5
x_str = 'Hello World'
x_bool = True
x_list = ['Nice', 'Beautiful', {'usr': 'root', 'pwd': 123}, 7]
x_dict = {'name': 'Darker', 'age': 18, 'gender': 'male'}
x_set = {1, 2, 3, 4, 5}
x_tuple = (9, 8, 7, 6, 5)
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>default</h1></div>
<div class="panel-body ">
<ul style="line-height: 30px;">
<li>x_num1:{{ x_num1|filesizeformat }}</li>
<li>x_num2:{{ x_num2|filesizeformat }}</li>
<li>x_num3:{{ x_num3|filesizeformat }}</li>
<li>x_num4:{{ x_num4|filesizeformat }}</li>
<li>x_num5:{{ x_num5|filesizeformat }}</li>
<li>x_num6:{{ x_num6|filesizeformat }}</li>
<li>x_num7:{{ x_num7|filesizeformat }}</li>
<li>x_num8:{{ x_num8|filesizeformat }}</li>
<li>x_str:{{ x_str|filesizeformat }}</li>
<li>x_bool:{{ x_bool|filesizeformat }}</li>
<li>x_list:{{ x_list|filesizeformat }}</li>
<li>x_dict:{{ x_dict|filesizeformat }}</li>
<li>x_set:{{ x_set|filesizeformat }}</li>
<li>x_tuple:{{ x_tuple|filesizeformat }}</li>
</ul>
</div>
</div>
结论:
- filesizeformat主要用于数字类型
- 最小单位是1字节(1bit)
- bool值
True
相当于数字1
,所以是1字节- 列表、字典、元组、集合、字符串 都无法计算大小
date - 返回日期
格式化日期
# views.py
from datetime import datetime
def test(request):
x_time = datetime.now()
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>date</h1></div>
<div class="panel-body ">
<ul style="line-height: 30px;">
<li>x_time:{{ x_time|date:"Y-m-d" }}</li>
<li>x_time:{{ x_time|date:"Y-m-d H-i-s" }}</li>
<li>x_time:{{ x_time|date:"Y-m-d | H-i-s" }}</li>
<li>x_time:{{ x_time|date:"Y年m月d日" }}</li>
<li>x_time:{{ x_time|date:"Y年m月d日 H时i分s秒" }}</li>
<li>x_time:{{ x_time|date:"Y年m月d日 | H时i分s秒" }}</li>
</ul>
</div>
</div>
结论:
Y
和H
需要大写,其余全部小写date:
后面不能出现空格
slice - 切片
顾头不顾尾
# views.py
def test(request):
x_str1 = '123456789'
x_str2 = '八进制和十进制其实也差不多,如果你少了两根手指头的话。'
x_str3 = 'Base eight is just like base ten really, if you\'re missing two fingers.'
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>slice</h1></div>
<div class="panel-body ">
<ul style="line-height: 30px;">
<li>x_str1 0:5:{{ x_str1|slice:"0:5" }}</li>
<li>x_str1 1:3:{{ x_str1|slice:"1:3" }}</li>
<li>x_str1 3:7:{{ x_str1|slice:"3:7" }}</li>
<li>x_str2 0:5:{{ x_str2|slice:"0:5" }}</li>
<li>x_str2 1:3:{{ x_str2|slice:"1:3" }}</li>
<li>x_str2 3:7:{{ x_str2|slice:"3:7" }}</li>
<li>x_str3 0:5:{{ x_str3|slice:"0:5" }}</li>
<li>x_str3 1:3:{{ x_str3|slice:"1:3" }}</li>
<li>x_str3 3:7:{{ x_str3|slice:"3:7" }}</li>
</ul>
</div>
</div>
结论:
- 这个切片和python的切片用法相同,都是顾头不顾尾,下标就是索引0开始的
- 中英文字符都一样
truncatechars - 最大可现实的字数
如果字符串字符多于指定的字符数量
,那么会被截断
。
截断的字符串将以可翻译的省略号序列(“...”)结尾。
# views.py
def test(request):
x_str1 = '123456789'
x_str2 = '八进制和十进制其实也差不多,如果你少了两根手指头的话。'
x_str3 = 'Base eight is just like base ten really, if you\'re missing two fingers.'
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>truncatechars</h1></div>
<div class="panel-body ">
<ul style="line-height: 30px;">
<li>x_str1:{{ x_str1|truncatechars:"1" }}</li>
<li>x_str1:{{ x_str1|truncatechars:"2" }}</li>
<li>x_str1:{{ x_str1|truncatechars:"3" }}</li>
<li>x_str1:{{ x_str1|truncatechars:"4" }}</li>
<li>x_str1:{{ x_str1|truncatechars:"5" }}</li>
<li>x_str2:{{ x_str2|truncatechars:"3" }}</li>
<li>x_str2:{{ x_str2|truncatechars:"10" }}</li>
<li>x_str2:{{ x_str2|truncatechars:"15" }}</li>
<li>x_str3:{{ x_str3|truncatechars:"3" }}</li>
<li>x_str3:{{ x_str3|truncatechars:"10" }}</li>
<li>x_str3:{{ x_str3|truncatechars:"15" }}</li>
</ul>
</div>
</div>
结论:
- 1、2、3都一样............
- 其余都要减个3
- 中英文都一样
safe - 语法标签转义
Django的模板中会对HTML标签和JS等语法标签进行自动转义`,原因显而易见,这样是为了
安全`。
但是有的时候我们可能不希望这些HTML元素被转义
,这时候就用到了safe过滤器了
# views.py
def test(request):
x_str1 = 'Hello World'
x_str2 = '<u>Hello World</u>'
x_str3 = '<a href="https://www.baidu.com">Hello World</a>'
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>safe</h1></div>
<div class="panel-body ">
<ul style="line-height: 30px;">
<li>x_str1 已转义:{{ x_str1 }}</li>
<li>x_str1 未转义:{{ x_str1|safe }}</li>
<li>x_str2 已转义:{{ x_str2 }}</li>
<li>x_str2 未转义:{{ x_str2|safe }}</li>
<li>x_str3 已转义:{{ x_str3 }}</li>
<li>x_str 未转义3:{{ x_str3|safe }}</li>
</ul>
</div>
</div>
结论:
- 加上
safe
,就像之前的mark_safe()
包裹住标签一样,被认为是安全的,可以被浏览器渲染
其他过滤器(了解)
六:标签
for标签 - 遍历每一个元素
for循环可以遍历每一个元素
# views.py
def test(request):
x_str = 'ABCDE'
x_list = ['Hello', 'Thank', 'You', 'Very', 'Much']
x_dict = {'name': 'Darker', 'age': 18, 'gander': 'male'}
x_set = {'a', 'b', 'c'}
x_tuple = (1, 2, 3)
return render(request, 'test.html', locals())
# test.html
<div class="row">
<div class="col-md-7 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>for</h1></div>
<div class="panel-body ">
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_str</p></div>
<div class="panel-body ">
{% for foo1 in x_str %}
<li>{{ foo1 }}</li>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_list</p></div>
<div class="panel-body ">
{% for foo2 in x_list %}
<li>{{ foo2 }}</li>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_dict</p></div>
<div class="panel-body ">
{% for foo3 in x_dict %}
<li>{{ foo3 }}</li>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_set</p></div>
<div class="panel-body ">
{% for foo4 in x_set %}
<li>{{ foo4 }}</li>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_tuple</p></div>
<div class="panel-body ">
{% for foo5 in x_tuple %}
<li>{{ foo5 }}</li>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_tuple reversed</p></div>
<div class="panel-body ">
{% for foo5 in x_tuple reversed %}
<li>{{ foo5 }}</li>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
结论:
- for循环的元素必须是可迭代对象
- 集合是无序的,所以每次结果都会不一样
- 可以利用
{% for obj in list reversed %}
反向完成循环。
forloop - 添加循环序号
循环序号可以通过{{forloop}}显示
循环 | 作用 |
---|---|
forloop.counter | 当前循环的索引值(从1开始) |
forloop.counter0 | 当前循环的索引值(从0开始) |
forloop.revcounter | 当前循环的倒序索引值(从1开始) |
forloop.revcounter0 | 当前循环的倒序索引值(从0开始) |
forloop.first | 当前循环是不是第1次循环(布尔值) |
forloop.last | 当前循环是不是最后1次循环(布尔值) |
forloop.parentloop | 本层循环的外层循环 |
# views.py
def test(request):
x_str = 'ABCDE'
return render(request, 'test.html', locals())
<div class="row">
<div class="col-md-7 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>forloop</h1></div>
<div class="panel-body text-center">
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_str</p></div>
<div class="panel-body">
{% for foo1 in x_str %}
<p>
{{ forloop.counter }}
|
{{ foo1 }}
</p>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_str</p></div>
<div class="panel-body ">
{% for foo1 in x_str %}
<p>
{{ forloop.counter0 }}
|
{{ foo1 }}
</p>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_str</p></div>
<div class="panel-body ">
{% for foo1 in x_str %}
<p>
{{ forloop.revcounter }}
|
{{ foo1 }}
</p>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_str</p></div>
<div class="panel-body ">
{% for foo1 in x_str %}
<p>
{{ forloop.revcounter0 }}
|
{{ foo1 }}
</p>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_str</p></div>
<div class="panel-body ">
{% for foo1 in x_str %}
<p>
{{ forloop.first }}
|
{{ foo1 }}
</p>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_str</p></div>
<div class="panel-body ">
{% for foo1 in x_str %}
<p>
{{ forloop.last }}
|
{{ foo1 }}
</p>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
结论:
- 这里的
forloop
相当于给可迭代对象的元素添加索引,元素缺失后,不影响索引的显示,还是原来的
for ... empty
for
标签带有一个可选的{% empty %}
从句,以便在给出的组是空的或者没有被找到时,可以有所操作。
# views.py
def test(request):
x_str1 = 'ABCDE'
x_str2 = ''
return render(request, 'test.html', locals())
# test.html
<div class="row">
<div class="col-md-7 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>empty</h1></div>
<div class="panel-body text-center">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_str</p></div>
<div class="panel-body">
{% for foo1 in x_str1 %}
<p>{{ foo1 }}</p>
{% empty %}
<p>暂无内容</p>
{% endfor %}
</div>
</div>
</div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_str</p></div>
<div class="panel-body">
{% for foo1 in x_str2 %}
<p>{{ foo1 }}</p>
{% empty %}
<p>暂无内容</p>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
结论:
empty
可以搭配其他的使用- 主要用于提示,如果没有元素,就显示
暂无内容
等信息
if 标签
% if %}
会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
# views.py
def test(request):
x_if1 = ''
x_if2 = 'Hello'
x_if3 = 0
x_if4 = 1
x_if5 = False
x_dic = {
'Alan': 85,
'Ben': 50,
'Cindy': 70,
'Danny': 60,
'Eddy': 99,
}
return render(request, 'test.html', locals())
# test.html
<div class="row">
<div class="col-md-7 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>if</h1></div>
<div class="panel-body text-center">
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_if1</p></div>
<div class="panel-body">
{% if x_if1 %}
<p>True</p>
{% else %}
<p>False</p>
{% endif %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_if2</p></div>
<div class="panel-body">
{% if x_if2 %}
<p>True</p>
{% else %}
<p>False</p>
{% endif %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_if3</p></div>
<div class="panel-body">
{% if x_if3 %}
<p>True</p>
{% else %}
<p>False</p>
{% endif %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_if4</p></div>
<div class="panel-body">
{% if x_if4 %}
<p>True</p>
{% else %}
<p>False</p>
{% endif %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_if5</p></div>
<div class="panel-body">
{% if x_if5 %}
<p>True</p>
{% else %}
<p>False</p>
{% endif %}
</div>
</div>
</div>
<div class="col-md-2">
<div class="panel panel-default">
<div class="panel-heading text-center"><p>x_dic</p></div>
<div class="panel-body">
{% for k,v in x_dic.items %}
{% if v >= 90 %}
<p>{{ k }}:优秀</p>
{% elif v >= 80 %}
<p>{{ k }}:良好</p>
{% elif v >= 60 %}
<p>{{ k }}:及格</p>
{% else %}
<p>{{ k }}:不及格</p>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
结论:
- 只要是:有值或者为True,就可以被识别为True
- 只要是:没有值(空列表、空集合、空字典)、为False,为0,就会被是被为False
- 字典取出
key
和value
需要在循环中加入.items
- if语句支持
and
、or
、==
、>
、<
、!=
、<=
、>=
、in
、not in
、is
、is not
判断。
with
使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
# views.py
def test(request):
class X_Info(object):
def __init__(self, name):
self.name = name
def print_name(self):
return self.name
def __str__(self):
return self.name
x_obj_d = X_Info('Darker')
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>with</h1></div>
<div class="panel-body text-center">
{% with x_obj_d.print_name as n1 %}
{{ n1 }}
{% endwith %}
</div>
</div>
结论:
- 相当于起了一个别名,但是 原来的名称还是可以用的
- 别名也要用
{{ }}
包裹起来才能用
csrf_token
{% csrf_token%}
- 这个标签用于跨站请求伪造保护
# views.py
def test(request):
return render(request, 'test.html', locals())
# test.html
<div class="panel panel-default">
<div class="panel-heading text-center"><h1>csrf_token</h1></div>
<div class="panel-body text-center">
{% csrf_token %}
</div>
</div>
结论:
- 用于跨站请求伪造保护,防止XSS攻击
- 这里的标签是看不见的,被隐藏的,但是还是在的
七:自定义过滤器、标签、inclusion_tag
自定义过滤器
1.在settings.py
的INSTALLED_APPS
中注册当前app
2.在当前app下 创建一个template
包(有__init__.py_
)
3.在template
包下创建my_tag.py
4.编写代码
from django import template
register = template.Library()
@register.filter
def my_upper(value):
return value.upper()
5.先load
,再使用
{% load my_tags %}
{{ 'aa'|my_upper }}
自定义标签
1.在settings.py
的INSTALLED_APPS
中注册当前app
2.在当前app下 创建一个template
包(有__init__.py_
)
3.在template
包下创建my_tag.py
4.编写代码
from django import template
register = template.Library()
@register.simple_tag
def my_csrf():
import uuid
res=uuid.uuid4()
return mark_safe('<input type="hidden" name="csrfmiddlewaretoken" value="%s">'%res)
5.先load
,再使用
{% load my_tags %}
{% my_csrf %}
{% my_tag 1 3 4 %}
自定义inclusion_tag
1.在settings.py
的INSTALLED_APPS
中注册当前app
2.在当前app下 创建一个template
包(有__init__.py_
)
3.在template
包下创建my_tag.py
4.编写代码
# inclusion_tag,传一个模板文件
@register.inclusion_tag('left.html')
def left(num):
# dic={0:第0页,1:第1页,2:第2页}
dic = {i: '第%s页' % i for i in range(num)}
# 固定返回的必须是字典
print(dic)
return {'data': dic}
@register.inclusion_tag('beautiful.html')
def beautiful(title, url):
return {'title': title, 'url': url}
5.先load
,再使用
{% load my_tags %}
{% left 5%}
{% beautiful '名字' '地址'%}
八:静态文件的使用
方式1
<link rel="stylesheet" href="/static/css/x.css">
方式2
{% load static %}
<link rel="stylesheet" href="{% static 'css/x.css' %}">
方式3
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix %}css/x.css">
特殊用法
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
{% load static %}
{% get_static_prefix as static %}
<img src="{{ static }}images/hi.jpg" alt="Hi!" />
九:模板的导入和继承
模板的导入
1.创建一个模板(例:my_head.html
)
# my_head.html
2.在要使用的地方,导入该模板
# index.html
模板的继承
1.创建一个母版
,当做一个盒子
# base.html
{% block top %}
...
{% endblock %}
{% block body %}
...
{% endblock %}
{% block footer %}
...
{% endblock %}
2.要继承的模板中,写入代码
# guide.html
{% extends 'base.html' %}
{% block top %}
index页面
{% endblock %}