• Django之template


    一.介绍

    在HTML的基础上加上模板语言(包括:会被替换掉的变量和标签)

    二.模板语法之变量( {{ }} )

    2.1 基本用法

     views:

    def index(request):
        import datetime
        s="hello"
        l=[111,222,333]    # 列表
        dic={"name":"yuan","age":18}  # 字典
        date = datetime.date(1993, 5, 2)   # 日期对象
     
        class Person(object):
            def __init__(self,name):
                self.name=name
     
        person_yuan=Person("yuan")  # 自定义类对象
        person_egon=Person("egon")
        person_alex=Person("alex")
     
        person_list=[person_yuan,person_egon,person_alex]
     
     
        return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list})

    template:

    <h4>{{s}}</h4>
    
    #通过'.'引用
    <h4>列表:{{ l.0 }}</h4>
    <h4>列表:{{ l.2 }}</h4>
    <h4>字典:{{ dic.name }}</h4>
    <h4>日期:{{ date.year }}</h4>
    <h4>类对象列表:{{ person_list.0.name }}</h4>
    
    #通过'.'引用对象的方法
    <h4>字典:{{ dic.name.upper }}</h4>

    2.2 过滤器

     语法:

    {{ 变量|过滤器:参数 }}
    #加法
    {{ i|add:5}}
    
    #如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值
    {{ value|default:"nothing" }}
    
    #返回值的长度。它对字符串和列表都起作用
    {{ value|length }}
    
    #将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
    {{ value|filesizeformat }}
    
    #如果 value=datetime.datetime.now()
    {{ value|date:"Y-m-d" }}
    
    #切片
    {{ value|slice:"2:-1" }}
    
    #截断字符串。截断的字符串将以可翻译的省略号序列(“...”)结尾。
    {{ value|truncatechars:9 }}
    
    #截断word。截断的word将以可翻译的省略号序列(“...”)结尾
    {{ value|truncatewords:2 }}
    
    '''
    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
    '''
    value="<a href="">点击</a>"
    
    {{ value|safe}}

     

    三.模板语法之标签( {% %} )

    3.1 标签操作

    #for循环
    {% for person in person_list %}
        <p>{{ person.name }}</p>
    {% endfor %}
    
    {% for key,val in dic.items %}
        <p>{{ key }}:{{ val }}</p>
    {% endfor %}
    #for...empty
    {% for person in person_list %}
        <p>{{ person.name }}</p>
      <p>{{ forloap.counter }}</p> #表示for循环的序号
    {% empty %} <p>sorry,no person here</p> {% endfor %}
    #if
    {% if num > 100 or num < 0 %}
        <p>无效</p>
    {% elif num > 80 and num < 100 %}
        <p>优秀</p>
    {% else %}
        <p>凑活吧</p>
    {% endif %}
    #url
    {{% url ... %}}
    #include继承
    {% include 'xxx.html' %}

    3.2 模板继承

    模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

    先建立一个母板

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <link rel="stylesheet" href="style.css" />
        <title>{% block title %}My amazing site{%/span> endblock %}</title>
    </head>
    
    <body>
        <div id="sidebar">
            {% block sidebar %}
            <ul>
                <li><a href="/">Home</a></li>
                <li><a href="/blog/">Blog</a></li>
            </ul>
            {% endblock %}
        </div>
    
        <div id="content">
            {% block content %}{% endblock %}
        </div>
    </body>
    </html>

    利用母板的html:

    {% extends "base.html" %}
     
    {% block title %}My amazing blog{% endblock %}
     
    {% block content %}
    {% for entry in blog_entries %}
        <h2>{{ entry.title }}</h2>
        <p>{{ entry.body }}</p>
    {% endfor %}
    {% endblock %}

     四. 自定义过滤器和自定义标签

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

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

    3、创建任意 .py 文件,如:my_tags.py

    from  django import template
    register=template.Library()
    
    #自定义过滤器
    @register.filter
    def mul_filter(x,y):
        return x*y
    
    #自定义标签
    @register.simple_tag
    def mul_tag(x,y,z):
        return x*y*z

    4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

    {% load my_tags %}

    5、调用simple_tag和filter

    # num=12
    {{ num|mul_filter:2 }} #24
     
    {{ num|mul_filter:"[22,333,4444]" }}
     
    {% mul_tag 2 5 6 %}  参数不限,但不能放在if for语句中
    {% mul_tag num 5 %}
    过滤器特点:最多接收两个参数,可以放在控制语句中

    标签的特点:不能放在控制语句中使用,参数不限
                    <p>{{ i|mul_filter:12}}</p>
                    <p>{{ i|add:12}}</p>
                    <p>{% mul_tag i 12 %}</p>
                    <p>
                       {% if i|mul_filter:10 > 100 %}
                           <span>100</span>
                       {% else %}
                           <span>{{ i }}</span>
                       {% endif %}
                    </p>
                    <p>
                       {% if {% mul_tag i 12 %} %}
                       
                       {% endif %}
                    </p>
    View Code

    自定义标签结合include使用:

    @register.inclusion_tag('blog/menu.html')
    def get_menu(username):
        import datetime, pytz
        blog_user = UserInfo.objects.filter(username=username).first()
        time_now = datetime.datetime.now()
        time_now = time_now.replace(tzinfo=pytz.timezone('Asia/Shanghai'))
        interval = (time_now - blog_user.create_time).days
        category_list=Category.objects.filter(blog=blog_user.blog).annotate(c=Count('article')).values_list('title','c')
        Tag_list=Tag.objects.filter(blog=blog_user.blog).annotate(c=Count('article')).values_list('title','c')
        archive_list=Article.objects.filter(user=blog_user).extra(select={'archive_time':"strftime('%%Y-%%m',create_time)"})
            .values('archive_time').annotate(c=Count('nid')).values_list('archive_time','c')
        return locals()
  • 相关阅读:
    【poj1195】Mobile phones(二维树状数组)
    【2018年全国多校算法寒假训练营练习比赛(第五场)-E】情人节的电灯泡(二维树状数组单点更新+区间查询)
    【2018年全国多校算法寒假训练营练习比赛(第五场)-G】 送分啦-QAQ(斐波那契博弈)
    【Wannafly挑战赛10
    【2018年全国多校算法寒假训练营练习比赛(第四场)- E】通知小弟(强连通缩点)
    JS中的forEach、$.each、map方法推荐
    关于echarts3地图下钻省市
    Vue2.0总结———vue使用过程常见的一些问题
    我理解的关于Vue.nextTick()的正确使用
    一个用 vue 写的树层级组件 vue-ztree
  • 原文地址:https://www.cnblogs.com/hantaozi430/p/8350523.html
Copyright © 2020-2023  润新知