zoukankan      html  css  js  c++  java
  • Django框架详解之template

    模板简介

      将页面的设计和python的代码分离开会更干净简洁更容易维护。我们可以使用Django的模板系统来实现这种模式

      python的模板:HTML代码+模板语法

      模板包括在使用时会被值替换掉的变量,和控制模板逻辑的标签

    变量

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

    {#语法#}   {{ var_name }}

      views

    def index(request):
        import datetime
        s='hello'
        l=[1,2,3]
        dic={"name":'lary',"age":18}
        date = datetime.date(2000,3,12)
    
        class Person(object):
            def __init__(self,name):
                self.name = name
    
        person_l=Person("lily")
        person_j=Person('jerry')
        person_t=Person('tom')
    
        person_li=[person_l, person_j, person_t]
    
        return render(request,'index.html',{"l":l,"dic":dic,"date":date,"person_list":person_li,"s":s})

      template

    <body>
    <h4>{{ s }}</h4>
    <h4>{{ l.0 }}</h4>
    <h4>{{ dic.name }}</h4>
    <h4>{{ date.year }}</h4>
    <h4>{{ person_list.0.name}}</h4>
    {#句点符也可以用来引用对象的方法(无参数方法)#}
    <h4>{{ dic.name.upper }}</h4>

    模板之过滤器

      语法

    {{obj|filter_name:param}}

    default

      如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值

    {{value|default:"nothing"}}

    length

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

    {{value|length}}

    filesizeformat

      将值格式化为一个可读的文件尺寸

    {{value|filesizeformat}}

    date

    {#如果value=datetime.datetime.now()#}
    {{value|date:"Y-m-d"}}

    slice

    {#如果value="hello world"#}
    {{value|slice:"2:-1"}}

    truncatechars

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

    {{value|truncatechars:9}}

    safe

      Django模板中会对HTML标签和js等语法进行自动转义,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,为了在Django中关闭HTML的自动转义的两种方式,如果是一个单独的变量可以通过"|safe"的方式告诉Django这段代码是安全的不必转义

    value="<a href="">点击</a>"
    {{value|safe}}

    autoescape

      控制当前的自动转义行为,此标记采用on或者off作为参数,并确定自动转义是否在块内有效。该块以endautoescape结束标签关闭

    def generate_report(request):
        report_name = "this is a test report"
        report_tilte = "<h1>this is a title</h1>"
        return render(request, 'report.html', locals())

       开启转义

    {% autoescape on %}   
    {{ report_title }}
    {% endautoescape %}

      关闭转义,默认该语句块中的内容是安全的

    {% autoescape off %}
    {{ report_title }}
    {% endautoescape %}

    模板之标签

      标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到额外信息到模板中,一些变迁需要开始和结束标签

    for标签

    {#遍历每一个元素#}
    <h4>{{ dic.name.upper }}</h4>
    {% for person in person_list %}
    <p>{{ person.name }}</p>
    {% endfor %}
    
    {#遍历字典#}
    {% for key,val in dic.items %}
        <p>{{ key }}:{{ val }}</p>
    {% endfor %}
    
    {#循环序号#}
    {{forloop.counter}}

    for...empty

      for标签带有一个可选的{% empty%}从句,以便在给出的组是空的或者没有被找到时,可以有所操作

    {#for empty#}
    {% for person in person_list %}
        <p>{{ person.name }}</p>
        {% empty %}
        <p>sorry,no person here</p>
    {% endfor %}

    if标签

      if标签会对一个变量求值,如果它的值是true,对应的内容块会输出

    {#if标签#}
    {% if num > 100 or num < 0 %}
        <p>无效</p>
    {% elif num > 80 and num < 100 %}
        <p>优秀</p>
    {% else %}
        <p>一般</p>
    {% endif %}

    with  

      使用一个简单的名字缓存一个复杂的变量,当你需要使用一个方法很多次的时候是非常有用的

    {#with标签#}
    {% with total=business.employees.count %}
        {{ total}}employee{{ tatal|pluralize }}
    {% endwith %}

    csrf_token

      这个标签用于跨站请求伪造保护

    {#csrf_token#}
    {% csrf_token %}

    自定义标签和过滤器

      在settings中的INSTALLED_APPS配置当前app

      在app中创建templatetags模块

      创建任意.py文件,如my_tags.py

    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library()
    
    @register.filter
    def filter_multi(x,y):
        return x*y
    
    @register.simple_tag
    def simple_tag_multi(x,y):
        return x*y
    
    @register.simple_tag
    def my_input(id,args):
        result="<input type='text' id='%s' class='%s'/>"%(id,args,)
        return mark_safe(result)

      在使用自定义simple_tag和fileter的html文件中导入之前创建的my_tag.py

    {% load my_tag %}

      使用simple_tag和filter

    {{ num|filter_multi:2 }}
    {{ num|filter_multi:"[22,33,444]" }}
    {#参数不限,但不能放在if for语句中#}
    {% simple_tag_multi 2 5 %}
    {% simple_tag_multi num 5 %}
    
    {#filter可以用在if等语句后,simple_tag不可以#}
    {% if num|filter_multi:30 > 100 %}
        {{ num|filter_multi:30 }}
    {% endif %}

      

  • 相关阅读:
    Death Race
    中国队吃中药了?
    (zt)让我们相亲相爱一百年不动摇
    Subversion & Arfa Karim Randhawa
    要是有时间的话……
    (zt)山王
    (zt)东方红
    Oracle 备份 与 恢复 概述
    Solaris 网络 配置
    RAID 磁盘阵列 详解
  • 原文地址:https://www.cnblogs.com/iamluoli/p/8876829.html
Copyright © 2011-2022 走看看