一、模板由 html代码+逻辑控制代码 组成
二、逻辑控制代码的组成
1、变量(使用双大括号来引用变量)
语法格式:{{ var_name }}
-----------------------Template和Context对象
(venv) C:UsersLowryPycharmProjectsdjango_template>python manage.py shell >>> from django.template import Context,Template >>> t=Template("my name is {{name}}") #逻辑控制代码一定要写在引号里面 >>> c=Context({'name':"alex"}) >>> t.render(c) 'my name is alex' #同一模板多个上下文 1、多次创建模板 >>> for name in ("john","julie","pat"): ... t=Template("hello,{{name}}") #缩进必须要有 ... print(t.render(Context({"name":name}))) ... hello,john hello,julie hello,pat 2、一次创建多次渲染 >>> t=Template("my name is {{name}}") >>> for name in ("john","alex","kobe"): ... print(t.render(Context({"name":name}))) ... my name is john my name is alex my name is kobe
----------------------------万能句点号,用于特殊变量的取值。点后面接的是对象的属性,这个要和filter的方法区分开。
-----------------------views import datetime def index(request): obj="alex" s=[111,222,333,"alex"] s1={"username":"alex","age":18} s2=datetime.datetime.now() class person(): def __init__(self,a,b): self.name=a self.age=b s3=person("yuan",18) return render(request,"index.html",{"name":s3}) -------------------------index.html {#{{ name }}#} {#{{ name.username }}#} {{ name.name }} {{ name.age }}
2、{% if %}的使用
{% if True %} //if后面接的是表示True或False的对象,可以是Ture或False,也可以是字符串、数字,但字符串必须要加引号,如果不加引号解释器会认为是变量。 <p>hello world</p> {% elif obj %} //这个obj在这里是变量,对应视图函数中render返回中的第三个参数 <p>hello 2</p> {% endif %}
3、{% for %}的使用
----------------------views def index(request): s=[111,222,333,"alex"] return render(request,"index.html",{"obj":s}) ----------------------index.html {% for i in obj %} <p>{{ forloop.counter }}:{{ i }}</p> //结果:1:111 2:222 3:333 4:alex <p>{{ forloop.counter0 }}:{{ i }}</p> //结果:0:111 1:222 2:333 3:alex <p>{{ forloop.revcounter }}:{{ i }}</p> //结果:4:111 3:222 2:333 1:alex <p>{{ forloop.revcounter0 }}:{{ i }}</p> //结果:3:111 2:222 1:333 0:alex {% endfor %}
4、filter的使用
语法格式: {{obj|filter:param}}
filter其实是上模板语言提供的方法,它是将前面的一个对象传到后面的方法中,有参数的在过滤器后面加冒号,然后加参数,处理过后再返回值,虽然有很多方法和python很像,但是不是python的,不要搞混。
---------------------views def index(request): ret="alex" return render(request,"index.html",{"obj":ret}) ---------------------index.html {{ obj|upper }} //ALEX {{ obj|lower }} //alex {{ obj|first }} //a {{ obj|first|upper }} //A {{ obj|capfirst }} //Alex
add过滤器
---------------------------views def index(request): s4=6 return render(request,"index.html",{"obj":s4}) ---------------------------index.html {{ obj|add:5 }} //结果:11
cut过滤器
--------------------------views def index(request): s5="hello world" return render(request,"index.html",{"obj":s5}) --------------------------index.html {{ obj|cut:"or" }} //结果:hello wld,如果cut的是字符串,要记得加上引号
date过滤器
--------------------------views def index(request): s2=datetime.datetime.now() return render(request,"index.html",{"obj":s2}) --------------------------index.html {{ obj|date:"y-m-d" }} //18-05-08,后面的格式要用引号引起来 {{ obj|date:"Y-m-d" }} //2018-05-08
default过滤器:如果值是False就替换成设置的默认值,否则就是用本来的值
-----------------------------------views def index(request): s6=[] return render(request,"index.html",{"obj":s6}) -----------------------------------index.html {{ obj|default:"空的" }}
{% autoescape off%}:注意这里是加在{% %}中的
#没加之前的效果 --------------------------------views def index(request): s7="<a href='#'></a>" return render(request,"index.html",{"obj":s6}) --------------------------------index.html {{ obj }} //<a href='#'>跳转</a> #加过之后的效果 --------------------------------views def index(request): s7="<a href='#'></a>" return render(request,"index.html",{"obj":s6}) --------------------------------index.html {% autoescape off %} {{ obj }} //跳转 {% endautoescape %}
safe过滤器:和上面起到的效果一样,都是让浏览器去渲染这个标签
--------------------------------views def index(request): s7="<a href='#'></a>" return render(request,"index.html",{"obj":s6}) --------------------------------index.html {{ obj|safe }} //跳转
其它过滤器:
-----------------------views def index(request): s5="hello world" return render(request,"index.html",{"obj":s5}) -----------------------index.html {{ obj|filesizeformat }} //0 bytes,为什么是0? {{ obj|length }} //11 {{ obj|slice:":-1" }} //hello worl
{% csrf_token %}:csrf_token标签
用于生成csrf_token的标签(其实就是一个input标签),用于防治跨站攻击验证。这个Input标签是隐藏的,名字为:csrfmiddlewaretoken,value是一堆字符串。
-------------------------------------views def login(request): if request.method=="POST": return HttpResponse("登陆成功") return render(request,"login.html") -------------------------------------index.html <form action="/login" method="post"> <p>姓名:<input type="text" name="username"></p> <p>密码:<input type="text" name="password"></p> <input type="submit"> {% csrf_token %} </form>
这里有一点需要注意的,这个方法只适用于render,对于render_to_response不适用,如果想使用需要额外加命令。
{% url %}
--------------------------------urls urlpatterns = [ path('admin/', admin.site.urls), path('login', views.login,name="abc"), ] --------------------------------views def login(request): if request.method=="POST": return HttpResponse("登陆成功") return render(request,"login.html") --------------------------------login.html <form action="{% url "abc" %}" method="post"> <p>姓名:<input type="text" name="username"></p> <p>密码:<input type="text" name="password"></p> <input type="submit"> {% csrf_token %} </form>
{% verbatim %}:不进行render渲染
{% verbatim %}
{{ obj }}
{% endverbatim %}
{% load %}:在HTML文件中加载自定义的simple_tag和filter时用的。
自定义simple_tag和filter
1、在app中创建templatetags文件夹或包
2、在templatetags中创建.py文件
from django import template from django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变 @register.simple_tag def myadd(v1): return v1+1001 @register.filter def myplus(v1,v2): return v1+v2
3、在HTML文件中引入py文件,然后进行调用
{% load my_tags %} 可以在HTML最上面,可以不在 {% myadd 1 %} #simple_tag用{% %}包着 {{ num|myplus:12 }} #filter和其它自带filter一样都是用{{ }}包着
4、一定要在settings中的INSTALL_APPS配置当前app,不然Django无法找到文件
注意:filter中最多只能有两个参数,而simple_tag中可以多个,但是simple_tag不能用在for或if后面,而filter可以
{% if num|myplus:20 > 100 %} <h1>大于100 </h1> {% endif %}