Django学习【第3篇】:Django 之模板语法

  Django框架之第三篇模板语法(重要!!!)

一.什么是模板?

只要是在html里面有模板语法就不是html文件内容了,这样的文件就叫模板。

二.模板语法分类

一.模板语法之变量:{{ }}:

在 Django 模板中遍历复杂数据结构的关键是句点字符. (也就是点)

 1 def index(request):
 2     name = "hello haiyan"
 3     i = 200
 4     l = [11,22,33,44,55]
 5     d = {"name":"haiyan","age":20}
 6 
 7     class People(object): #继承元类
 8         def __init__(self,name,age):
 9             self.name = name
10             self.age = age
11         def __str__(self):
12             return self.name+str(self.age)
13         def dream(self):
14             return "你有梦想吗?"
15     #实例化
16     person_egon = People("egon",10)
17     person_dada = People("dada",34)
18     person_susan = People("susan",34)
19     person_list = [person_dada,person_egon,person_susan]
20 
21     return render(request,"index.html",
22                     {
23                         "name":name,
24                         "i":i,
25                         "l":l,
26                         "d":d,  #键对应的是模板里的名字。值对应的是上面定义的变量
27                         "person_egon":person_egon,
28                         "person_dada":person_dada,
29                         "person_list":person_list,
30                     }
31               )
32     # return render(request,"index.html",locals())
33     #用locals()可以不用写上面的render了。不过用locals(),views里面用什么名。模板里面就得用什么名
34     # locals()局部的:用了locals就相当于都得按照上面的那样
View.py
 1 <h4>变量{{ z }}:深度查询</h4><hr>
 2 <h3>{{ name }}</h3>
 3 <p>{{ i }}</p>
 4 <p>{{ l }}</p>
 5 <p>{{ d }}</p>
 6 <p>{{ l.0 }}------》取单个值可通过句点符(也就是点)</p>
 7 <p>{{ l.4 }}</p>
 8 <p>{{ d.name }}</p>
 9 <p>{{ d.age }}-----》字典也可以根据句点符取值,一个点就搞定了。
10 然而在前端页面中是看不到你的模板语法的,当你点击审查元素的
11 时候,你就会发现,偷偷的换过来了</p>
12 <p>{{ person_dada.name }}</p>
13 <p>{{ person_egon.age }}</p>
14 <p>{{ person_dada.dream }}</p>  <!-- .方法的时候,注意当前的dream方法是没有参数的-->
15 <p>{{ person_list.2 }}</p>  <!--单个取值-->
16 <p>{{ person_list.1.name }}</p>
17 <!-- 那怎么让对象变成字符串呢?在index视图函数里里面再加上一个__str__内置方法-->
18 <!--__str__是对象字符串的改变-->
template/index.html

  注意:句点符也可以用来引导对象的方法(无参数方法)。

<h4> 字典:{{ dic.name.upper }} </h4>

二.模板语法之标签: 语法为 {% tag %}:

标签看起来像是这样的{% tag %}.  标签比变量更加复杂:一些在输出中创造文本,一些通过逻辑控制流程,一些加载其后的变量将使用额外的信息加载到模板中。

一些标签需要开始和结束标签,例如 {% tag %}  ... 标签 内容 ... {% tag %}.

1. for标签 (注:循环序号可以通过 {{forloop}} 显示)

<h3>循环取值1</h3><hr>
{% for item in person_list %}
    <p>{{ item.name }},{{ item.age }}</p>
{% endfor %}

<h3>循环取值2:倒序</h3><hr>
{% for item in person_list reversed %}
    <!--序号从1开始-->
    <p>{{ forloop.counter }}----->{{ item.name }},{{ item.age }}</p>
    <!--序号从0开始--><p>{{ forloop.counter0 }}----->{{ item.name }},{{ item.age }}</p><!-- 序号倒序 --><p>{{ forloop.revcounter }}----->{{ item.name }},{{ item.age }}</p>
{% endfor %}

<h3>循环取值3:字典</h3><hr>
{% for k,v in d.items %}
    <p>{{ k }},{{ v}}</p>
{% endfor %}

2.  for ...empty :for 标签带有一个可选的 {% empty %} 从句,以便给出的组是空的,或者是没有找到时,可以进行操作。

{% for person in person_list %}
    <p> {{person.name}} </p>

{% empty %}
    <p>{{sorry,no person here </p>

{% endfor %}

3. if标签 : {% if %}

会对一个变量求值,如果它的值时"True" (存在,不为空,且不是boolean类型的false值),对应的内容块会输出。

{% if i > 300 %}
    <p>大于{{ i }}</p>
{% elif i == 200  %}
    <p>等于{{ i }}</p>
{% else %}
    <p>小于{{ i }}</p>
{% endif %}

4.with:使用一个简单的名字缓存一个复杂的变量,当你需要一个“昂贵”的方法(比如使用数据库)很多次的时候是非常有用的

{% with total=business.employees.count %}
    {{ total }} employee {{ total|pluralize }}
{% endwith %}

<p> {{ person_list.2.name }}</p>
{% with name=person_list.2.name %}
    <p>{{ name}}</p>
{% endwith %}

5. csrf_token:这个标签用于跨站请求伪造保护

提交数据的时候就会在安全机制,当你点击提交的时候就会出现一个forbbiddon的错误,就是用setting配置的scrf做安全机制的,那么我们可以把它给注释了,,,

或者在form表单下面添加一个{% csrf_token %},,,

这才是真正的解决办法,注释不是解决的办法

<h3> scrf_token</h3>
<form action="/tag/" methon="post">
    {% csrf_token %}
    <p>  <input type="text" name="wenqiang"></p>
    <input type="submit">
</form>

三. 模板语法之过滤器: 语法{{obj|filter_name:param}}

1. default: 如果一个变量为flase或者为空,使用给定的默认值。否者使用变量的值。

<p> default 过滤器:{{li|default:"如果显示为空,设置的解释性内容“}}</p>

2. length: 返回值的长度。它对字符串和列表都起作用。

{{value|length}}
如果value是["a","b","c","d"],那么输出的是4

3.filessizeformat : 将值格式化为一个”人类易读的“文件尺寸(例如:"15bytes","12KB","4.1MB",等等)

{{ value|filesizeformat}}
如果value是123456789,输出将会输出是117.7MB

4.date:如果 value=datatime.datetime.now()

{{value|date:"Y-m-d H:i:s"}}

5.slice: 切片

如果value="hello world"
{{value|slice:"2:-1"}}
对value进行切片操作

6.truncatechars 截断

如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

参数: 要截断的字符数

<p> 截断字符:{{content|truncatechars:20}}</p>
<p>截断单词:{{content|truncatewoeds:4}}</p>

如果content是"I am wenqiang,how are you qwertyuiopertyuio?"

输出结果:截断字符:I am wenqiang,how...
输出结果:截断单词:I am wenqiang,how are...

7.safe

Django的模板中会对HTML和JS等语法标签进行自动转义,原因就是为了安全。但是有些时候,我们不希望HTML被转义,比如我们做一个内容管理系统,后台添加的文章是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动退转义的话显示的就是保护HTML标签的源文件。在Django中关闭HTML自动转义有两种方式:

  如果是一个单独的变量,我们可以通过过滤器"|safe"的方式告诉Django这段代码是安全的不必转义。

value '<a href="">点击</a>'
{{ value|safe}}
<p>{{ label }} </p> #为了安全,系统会把标签变成字符串
<p>{{ label|safe }}</p> #加上safe,确定你的数据是安全的,才能被当成标签

四.自定义标签和过滤器

1.在settings中的INSTALLED_APPS配置当前的app,不然django无法找到自定义的simple_tag.

2.在app中创建templatetags模块(模块名只能是templatetags)

3.在templatetags里面创建任意 .py 文件。

 1 from django import template
 2 from django.utils.safestring import mark_safe
 3  
 4 register = template.Library()   #register的名字是固定的,不可改变
 5 @register.filter   过滤器
 6 def multi(x,y):
 7     return x*y
 8 
 9 @register.simple_tag  标签
10 def multitag(x,y,z):
11     return x*y*z
12 @register.simple_tag  标签
13 def my_input(id,arg):
14    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
15    return mark_safe(result)
my_tags.py

4.在使用自定义的simple_tag和filter (如何调用)

过滤器:{{var|filter_name:参数}} #参数有两个,一个参数是变量var,一个是参数

标签:{% simple_tag参数1 参数2 ... %}

-------------------------------.html
{% load xxx %}   #xxx 代表需要引入的html文件名
      
# num=12
{{ num|multi:2 }} #24
 
{{ num|multi:"[22,333,4444]" }}   相当于复制了,吧[22,333,4444]乘了num遍
{% multitag 2 5 6 %} 参数不限,但不能放在if for语句中 {% simple_tag_multi num 5 %}

自定义过滤器函数的参数只能有两个,可以进行逻辑判断,

自定义的标签无参数参数限制,不能进行逻辑判断

{% i|multi:5> 1000 %}  #判断i*5>1000
    <p>大于{{i}}</p>
{% else %}
    <p>大于等于{{i}}</p>
{% endif%}

 

posted @ 2018-09-10 16:54  pupilheart  阅读(314)  评论(0)    收藏  举报
小强带你挣小钱v:zln88896

公告

点击 更新中