Django----模板层
一、模板层:
python的模板:HTML代码+模板语法
模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签。
import datetime t=datetime.datetime.now() # 方式1: return HttpResponse("<h1>%s</h1>"%str(t)[:19]) # 方式2: from django.template import Template, Context templateObj=Template("<h1 style='color:red'>current time: {{ time }}</h1>") contextObj=Context({"time":str(t)}) html=templateObj.render(contextObj) return HttpResponse(html) #方式3(常用的) return render(request,"time.html",{"time":str(t)[:19]})
二、模板语法之变量
在 Django 模板中遍历复杂数据结构的关键是句点字符 .
1.语法:
{{var_name}}
views:
import datetime li=[] name="mqj" i=100 l=[777,888,[55,55,99]] d={"name":"mqj","age":"22"} date = datetime.date(1993, 5, 2) t=datetime.datetime.now() class Person(object): def __init__(self,name,age): self.name=name self.age=age def dream(self): return "I an dream" person_egon = Person("egon", 1000) person_alex = Person("alex", 9000) person_nacha = Person("nacha", 10000) PersonList=[person_egon,person_alex,person_nacha] coutext="ddssdd dssdsad djjjd ddddd ccsd cdc dS SD Dcdcd" label = "<a href=''>点击</a>" return render(request,"index.html",{"name":name,"l":l,"d":d,"date":date,"t":str(t),"person_egon":person_egon,"PersonList":PersonList,"coutext":coutext,"label":label,"i":i})
template:
<p>{{ name }}</p> <p>{{ l.2.1}}</p> <p>{{ i }}</p> <p>{{ d.age }}</p> <p>{{ date.month}}</p> <p>{{ t }}</p> <p>{{ person_egon.name }}</p> <p>{{ person_egon.age }}</p> <p>{{ person_egon.dream }}</p> <hr> <p>{{ PersonList.0.name }}</p> <hr> {% for k,v in d.items %} <p>{{ k }},{{ v }}</p> {% endfor %} <hr> {% for Proson in PersonList %} <p>{{ Proson.name }}</p> {% endfor %} <hr> {% for Proson in PersonList reversed %} <p>{{ forloop.counter }}--{{ Proson.name }},{{ Proson.age }}</p> {% endfor %}
三、模板之过滤器
1.语法
{{obj|filter__name:param}}
2.date:
如果 value=datetime.datetime.now()
{{ date|date:"Y-m-d" }}
3.default:
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
{{ li|default:"nothing" }}
4.safe:
value
=
"<a href="
">点击</a>"
{{ value|safe}}
5.slice:
如果 value="hello world"
{{ value|
slice
:
"2:-1"
}}
6.truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
{{ value|truncatechars:
9
}}
四、模板之标签
1、for标签
遍历每一个字典:
{% for k,v in d.items %}
<p>{{ k }},{{ v }}</p>
{% endfor %}
可以利用{% for obj in list reversed %}反向完成循环。
2.遍历每一个元素:
{% for person in person_list %} <p>{{ person.name }}</p> {% endfor %}
3.注:循环序号可以通过{{forloop}}显示
forloop.counter0 从0开始
forloop.revcounter0 反向从直到0
forloop.revcounter 反向开始
如:
{% for Proson in PersonList reversed %}
<p>{{ forloop.counter }}--{{ Proson.name }},{{ Proson.age }}</p>
{% endfor %}
1、if 标签
{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
{% if i > 100 %} <p>{{ i }}</p> {% elif i == 100 %} <p>等于100</p> {% else %} <p>{{ i }}</p> {% endif %}
2、with
使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
{% with a="mqj" %} <p>{{ a }}</p> {% endwith %}
3、csrf_token
这个标签用于跨站请求伪造保护
五、自定义标签和过滤器步骤:
1 、在settings中的INSTALLED_APPS,是否有当前应用
2 、在应用中创建一个templatetags
3 、在templatetags中创建py文件:mytag.py
4 、在mytag.py中:
引入:from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改变
5 、定义过滤器和标签
@register.filter
def multi(x,y):
return x*y
@register.simple_tag
def multiTag(x,y,z):
return x*y*z
6 、 在引用模板中导入:{% load myTag %}
7 、 调用:
过滤器: {{var|filter_name:参数}} # 参数只能是一个
标签: {% simple_tag 参数1 参数2 ... %}
对比过滤器与自定义标签的使用:
过滤器函数的参数只能有两个,自定义标签无参数限制
过滤器可以与逻辑标签共同使用,比如if标签。自定义标签不可以。