Django之Template

发布时间:2019-03-28 20:42:41编辑:auto阅读(1558)

    Template模板

    • Template模板的使用帮助我们将数据对应的插入到html文档中显示给用户。

    一.Template和Context对象

    
    t = Template('My name is {{ name }}.')
    c = Context({'name': 'sfencs'})
    print(t.render(c))
    

    二.引入html中

    在视图函数中:

    
    def login(req):
        return render(req,"test.html",{"name":"sfencs"})
    

    在html中

    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {{ name }}
    </body>
    </html>
    

    这样在浏览器中渲染出的就是sfencs,即把{{ name }}替换成了views函数传递的字典对应的值。

    三.变量

    如上节所写,{{ }}中放入的就是变量
    可是有时候我们传给模板的并不一定只是一个字符串,有可能是一个字典,一个列表,那怎样在模板中对它们进行操作呢?
    方法是使用”.”句点号

    • 表示索引:item.2
    • 表示字典的键的值:item.key
    • 表示对象的属性:item.property,自定义的类的对象的属性也可以
    • 表示对象的方法:item.function_name,只能使用不需要参数的方法

    四.过滤器filter

    filter就相当于是对模板中变量执行的方法,使用方法是{{obj|filter:param}}
    介绍几个简单的pyth内置的过滤器

    • add : 给变量加上一个值
    • addslashes:给变量中的引号前加上斜线
    • capfirst:首字母大写
    • default:如果值是False,就替换成设置的默认值,否则就是用本来的值

    具体其他的内置过滤器可以参考https://blog.csdn.net/foryouslgme/article/details/52057445
    这里过滤器后边只能跟一个参数。

    五.tag标签

    if
    
    {% if age == 3 %}
        <p>等于3</p>
    {% elif age > 3 %}
        <p>大于3</p>
    {%else  %}
        <p>小于3</p>
    {% endif %}
    

    注意age与符号之间有空格
    if标签中可以使用and,or,但不能同时使用and和or

    for
    {% for i in people %}
      <h1>{{ people.name }}</h1>
      <ul>
      {% for j in i.hobby %}
        <li>{{ j }}</li>
      {% endfor %}
      </ul>
    {% endfor %}
    

    for标签中自带了一个forloop变量可以提供有关循环的信息

    • forloop.counter表示循环的次数,它从1开始计数
    • forloop.counter0表示循环的次数,它从0开始计数
    • forloop.revcounter 是表示循环中剩余项的整型变量。 在循环初次执行时 forloop.revcounter 将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1
    • forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引
    • forloop.first当第一次循环时值为True

    {% empty %}表示如果循环项为空则执行的部分
    {% for obj in list reversed %}表示反序循环

    {%csrf_token%}

    在表单最后加上{%csrf_token%},用于防治跨站攻击验证

    {% with %}

    用更简单的变量名替代复杂的变量名

    {% with simple=complex %} 
    {{simple }}
     {% endwith %}
    
    {% verbatim %}

    不适用render传来的content

    
    {% verbatim %}
    {{ age }}
    {% endverbatim %}
    

    页面显示的是
    {{ age }}

    六.自定义filter和simple_tag

    1.在app中创建templatetags文件包
    2.在templatetags文件包下创建一个python文件,名称自己取如:my_tags
    3.在my_tags中引入template,创建register
    
    from django import template
    register = template.Library()
    
    4.创建自己的filter或tag

    使用相应的装饰器

    
    @register.filter
    def filter_mult(v1,v2):
        return  v1 * v2
    
    @register.simple_tag
    def simple_tag_multi(v1,v2):
        return  v1 * v2
    
    5.在html中引入该文件
    
    {% load my_tags %}
    
    6.在html中使用
    
    {{ age|filter_mult:2 }}
    
    {% simple_tag_mult age 3 %}
    
    7.注意
    • filter最多只能有两个参数,tag可以有多个参数
    • filter可以使用在if等语句后,tag不可以

    七.extend模板继承

    模板继承可以解决html代码重复的问题,比如两个页面的大体结构类似,只有小部分的内容不同,如果写到两个不同的html中就会有相当多的代码重复,这个时候将相同部分的html写到一个html中,不同的部分用模板表示,再用一个新的html继承它,并将模板的部分代替。

    1.基础html定义要替代的代码块
    
    {% block content %}
    
    {% endblock %}
    

    这里block可以起不同的名称,用于不同的代码块的替换

    2.在另一个html中继承它

    首先要在文档开头添加{% extends “base.html” %},表示要继承的html
    然后按照block名称相应的写入要代替的内容

    
    {% block title %}
    {{age}}
    {% endblock %}
    
    3.例如:
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {% block title %}
    
    {% endblock %}
    </body>
    </html>
    
    
    {% extends "base.html" %}
    
    {% block title %}
    {{age}}
    {% endblock %}
    

关键字