1.模板渲染:
①通过给模板传递字典参数进行渲染
注意:参数中键给前端模板中使用,值是视图函数中定义变量的值
1.视图函数:
def index(request):
num = 100
name = 'shige'
l1 = ['大壮', '小壮', '壮壮', '中壮']
d1 = {'name': '大壮', 'age': 73, 'hobby': 'xuefei+xiangxi'}
xx = 'oo'
class Animal:
def __init__(self):
self.kind = 'dog'
def eat(self):
return 'shi'
a = Animal()
return render(request,'login1.html',{'num':num,'name':name,'l1':l1,'d1':d1,'a':a})
2.模板中:
<body>
<p>{{ num }}</p> #100
<p>{{ name }}</p> #shige
<p>{{ l1 }}</p> #['大壮', '小壮', '壮壮', '中壮']
<p>{{ d1 }}</p> #{'name': '大壮', 'age': 73, 'hobby': 'xuefei+xiangxi'}
<p>{{ a.kind }}</p> #dog
<p>{{ a.eat }}</p> #shi
</body>
②模板系统中的“.",可以取出字典中的键值和列表中的值
注意:列表取元素从0开始
def index(request):
d1 = {'name': '大壮', 'age': 73, 'hobby': 'xuefei+xiangxi'}
l1 = ['大壮', '小壮', '壮壮', '中壮']
return render(request,'login1.html',{'num':num,'name':name,'l1':l1,'d1':d1,'a':a})
<body>
<p>{{ d1.age}}</p> #73
<p>{{ d1.name}}</p> #大壮
<p>{{ l1.0}}</p> #大壮
<p>{{ l1.1}}</p> #小壮
<p>{{ l1.2}}</p> #壮壮
</body>
③模板渲染传递对象
注意:在模板渲染中,对象调用函数不能加括号,并且不能调用带参函数
def index(request):
class Animal:
def __init__(self):
self.kind = 'dog'
def eat(self):
return 'shi'
a = Animal()
return render(request,'login1.html',{'num':num,'name':name,'l1':l1,'d1':d1,'a':a})
<body>
<p>{{ a.kind }}</p> #dog
<p>{{ a.eat }}</p> #shi
</body>
④直接在render中传入locals(),即可把函数内部所有变量封装成键值对的字典传入到模板中
注意:在前端模板使用时候,必须用视图函数中变量名调用,否则出错
return render(request,'login1.html',locals())
2.模板系统中的变量和过滤器:
格式:{{ 变量名| 属性:' 参数' }}
<p>{{ l1|length }}</p> #列表长度
<p>{{ vv|default:'啥也没有' }}</p> #如果视图函数中没有vv变量,显示默认值,否则用视图函数中的值
<p>{{ movesize|filesizeformat }}</p> # 117.4 MB
<p>{{ name|slice:':3' }}</p> # 将字符串从哪切到哪
<p>{{ now|date:'Y-m-d' }}</p> # 2020-06-21
<p>{{ words|truncatechars:'9' }}</p> #字符留几个,其他用... i love...
<p>{{ words|truncatewords:'3' }}</p> #单词留几个
<p>{{ words|cut:' ' }}</p> #空格移除
<p>{{ l1|join:'+' }}</p> #用+将列表元素拼接
<p>{{ tag|safe }}</p> #如果tag中有html标签,默认按照原字符串显示,如果加上safe属性,则按照html 样式显示
3.模板系统中的标签:
①循环列表元素
<ul>
{% for name in l1 %} #l1是一个列表
<li>{{ name }}</li>
{% endfor %}
</ul>
②循环字典元素
<ol>
{% for key,value in d1.items %}
{{ forloop.counter }}
<li>{{ key }} -- {{ value }}</li>
{% endfor %}
</ol>
③只循环字典中的key元素
<ol>
{% for key in d1.keys %}
{{ forloop.counter }}
<li>{{ key }}</li>
{% endfor %}
</ol>
④只循环字典中的value元素
<ol>
{% for value in d1.values %}
{{ forloop.counter }}
<li>{{ value }}</li>
{% endfor %}
</ol>py
⑤计数标签
{{ forloop.counter }} #从1开始计数
{{ forloop.counter0 }} #从0开始计数
{{ forloop.revcounter }} #从1开始倒序计数
{{ forloop.revcounter0 }} #从0开始倒序计数
{{ forloop.first }} #是第一次循环即为true
⑥empty
{#<ul>#}
{# {% for foo in d3 %}#}
{# <li>{{ foo }}</li>#}
{# {% empty %}#}
{# <li>查询的内容啥也没有</li>#}
{# {% endfor %}#}
{##}
{#</ul>#}
⑦if标签
{% if num > 10 %}
<a href="">大于10</a>
{% elif num < 10 %}
<a href="">小于10</a>
{% else %}
<a href="">等于10</a>
{% endif %}
{% if d3|length > 3 %}
<a href="">大于3</a>
{% elif d3|length < 3 %}
<a href="">小于3</a>
{% else %}
<a href="">等于3</a>
{% endif %}
⑧with语句,起别名,方便引用
<h1>{{ d2.hobby.0 }}</h1> #字典嵌套列表
{% with shitai=d2.hobby.0 %} #其中=两边不能加空格
{% endwith %}
{% with d2.hobby.0 as shitai %} #其中=两边不能加空格
{% endwith %}
4.crsf安全机制:
①在前端页面写入该标签,浏览器页面源码会出现以下信息,因此post请求可以提交
注意:浏览器发起post请求需要提交一个信息,表明是该网站给浏览器的显示
{% csrf_token %}
5.模板继承:
①为什么需要模板继承:因为很多网页中很多内容是相同的,继承可以避免重新写
{% extends 'muban.html' %} #必须写在第一行
{% block content %}
替换的内容
{% endblock %}