设为首页 加入收藏

TOP

Django之模板层(一)
2019-01-02 00:09:01 】 浏览:127
Tags:Django 模板

  在一个项目里面有一个专门放模板的文件夹Templates,有一个专门放视图的文件views,而且我们大多给浏览器响应的都应该是一个完整的页面,也就是读取的是一个HTML文件,然后再返回给浏览器。但我们在写HTML文件时,里面关于要从数据库拿数据,或者经常更改的地方又不能写死了,此时就需要用到模板语法了,在HTML文件中写上模板语法,然后在views读取HTML文件时,再对HTML文件中模板语法进行解析,替换。这样即完成解耦,又实现代码的复用性。

  一、模板语法中的变量

  Templates中的HTML文件::

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p>{{ content }}</p>
    <p>{{ l1.0 }}</p>
    <p>{{ l1.1 }}</p>
    <p>{{ d1.name }}</p>
    <p>{{ d1.age }}</p>
    <p>{{ p1.id }}</p>
    <p>{{ p1.hobby }}</p>
  <p>{{p1.func}}</p>
</body> </html>

  views.py文件:

def test(request):
    l1=[1,2,4,6]
    d1={'name':'hh','age':20}
    content='你好啊,你在哪'
    class Person(object):
        def __init__(self,id,hobby):
            self.id=id
            self.hobby=hobby
     def func(self):
       return 111
p1
=Person('xx',30) return render(request,'test.html',{'content':content,'l1':l1,'d1':d1,'p1':p1})

  对于变量来说,我们用句点符‘.’,就可以拿到值。引用对象的方法时,拿到的是方法的返回值。

  二、模板中的过滤器

<p>{{ value|default:'nothing' }}</p>
默认值过滤器,当value有值时,就用它自己的值,但当value为False或空时,就用默认值‘nothing’
<p>{{ value|length }}</p>
返回的是值的长度,字符串、列表可以用,返回数据长度
<p>{{ value|filesizeformat }}</p>
返回的是一个很容易读的文件大小,比如文件为123456789字节,输出会是117.7MB
<p>{{ value|date:'Y-m-d' }}</p>
如果value=datetime.datetime.now(),返回的是年月日
<p>{{ value|slice:'2:5' }}</p>
如果value=‘qwertyu’,返回的就是erty
<p>{{ value|truncatechars:9 }}</p>
如果字符串长度大于截断量,就会被截断,截断的字符串将以‘...’结尾,所以实际看到的字符要少三个
<p>{{ value|truncatewords:3 }}</p>
这也是截断,但这是按单词数来截断
<p>{{ value|safe }}</p>
value=‘<a href=''>点击</a>’,如果没有safe,会把标签转义,比如‘<’转义为'&gl;',在浏览器上看到也不是‘<’,而是'&gl;',但这样破坏了我想要的形式
但当加上safe之后,他就会原样输出

  三、模板中的标签

  1,for标签,就是遍历每一个元素

{% for item in l1 %}
        <p>{{ item }}</p>
    {% endfor %}
会遍历l1列表中的每一个元素,然后再放进p标签中
{% for foo in l1 reversed %}这样就可以反向遍历了
{% for k,v in d1.items %}
<p>{{ k }}:{{ v }}</p>
{% endfor %}
这样就可以循环拿到字典中的key和value
{% for item in l1 %}
<p>{{ item }}</p>
<p>{{ forloop.counter }}</p> 得到循环序号,从1开始
<p>{{ forloop.counter0 }}</p> 得到循环序号,从0开始
<p>{{ forloop.revcounter }}</p> 得到循环序号,比如数据长度为5,就从5开始,降序,最后一个为1
<p>{{ forloop.revcounter0 }}</p> 得到循环序号,比如数据长度为5,就从4开始,降序,最后一个为0
<p>{{ forloop.first }}</p> 得到第一个序号
<p>{{ forloop.last }}</p> 得到最后一个序号
{% endfor %}
{% for k,v in d1.items %}
<p>{{ k }}:{{ v }}</p>
{% empty %}
<p>没有这个字典,或者字典为空</p>
{% endfor %}
empty的作用就是,当你循环列表或字典时,没有找到或为空时,就返回empty中的内容

  2,if标签,做判断使用

{% if num > 100 %}
        <p>大于100</p>
{% elif num > 50 and num < 100 %} 
        <p>大于50,小于100</p>
{% else %}
        <p>小于50</p>
{% endif %}

  3,with标签

{% with hobby=p1.hobby %}
        <p>{{ hobby }}</p>
    {% endwith %}
相当于给一个复杂的东西取个别名,之后用别名就行了

  4,csrf_token,用于跨站请求伪造保护

<form action="{% url 'log' %}" method="post"> {% csrf_token %}
        姓名 <input type="text" name="user">
        密码 <input type="password" name="pwd">
        <in
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python装饰器2:进阶 下一篇python装饰器(新年第一写)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目