zoukankan      html  css  js  c++  java
  • 【Django】模板系统

    @


    官方文档



    两种特殊符号:{{ }}{% %}
    变量相关使用{{ }},逻辑相关使用{% %}.

    一、变量

    在Django模版语言中按此语法使用:{{ 变量名 }}

    当模版引擎遇到一个变量时,它将计算这个变量,然后用结果替换它本身.
    变量的命名包括任何字母数字以及下划线(_)的组合.
    变量名称中不能有空格或标点符号.

    点(.) 在模版语言中有特殊的含义,当模版系统遇到点时,它将以以下顺序查询:

    1. 字段查询(Dictionary lookup)
    2. 属性或方法查询(Attribute or method lookup)
    3. 数字索引查询(Numeric index lookup)

    注意事项:

    1. 如果计算结果的值是可调用的,它将被无参数调用,调用的结果将成为模版的值.
    2. 如果使用的变量不存在,模版系统将插入 string_if_invalid 选项的值,此选项的值默认为空字符串.

    简单示例:

    from django.shortcuts import HttpResponse, render, redirect
    
    
    def template_test(request):
        lst = ['a', 'b', 'c', 'd']
    
        dct = {
            'name': 'zyk',
            'sex': 'boy',
            'hobby': ['Python', 'Django', 'MySQL']
        }
    
        class Person(object):
            def __init__(self, name, sex):
                self.name = name
                self.sex = sex
    
            def blogging(self):
                return '%s is blogging.' % self.name
    
        zyk = Person('zyk', 'boy')
        xhh = Person('xhh', 'girl')
        xmm = Person('xmm', 'girl')
        person_list = [zyk, xhh, xmm]
    
        return render(
            request,
            'template_test.html',
            {
                'lst': lst,
                'dct': dct,
                'person_list': person_list
            }
        )
    

    模版中可以这样写:

    取lst中索引为0的值:
    {{ lst.0 }} # a
    取dct中name的值:
    {{ dct.name }} # zyk
    取dct中的hobby列表中的索引为1的值:
    {{ dct.hobby.1 }} # Django
    取person_list中索引为2的对象的name:
    {{ person_list.2.name }} # xmm
    调用person_list中索引为0的对象的blogging方法:
    {{ person_list.0.blogging }} # zyk is blogging.



    二、过滤器 Filters

    在Django模版语言中,通过使用 过滤器 来改变变量的显示.

    语法:{{ 变量|过滤方法:参数 }}
    其中:管道符(|)用来应用过滤器,冒号(:)用来指定过滤器的参数.

    注意事项:

    1. 过滤器支持"链式"操作,即一个过滤器的输出可以作为另一个过滤器的输入.
    2. 过滤器可以接受参数,例如:{{ value|truncatewords:30 }},表示显示values的前30个词.
    3. 过滤器参数包含空格的话,必须用引号包裹起来,比如使用逗号和空格拼接列表中的元素:{{ list|join:', ' }}.
    4. 管道符(|)两边没有空格.

    1. default

    指定变量的默认值.
    语法:value|default:"默认值"

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

    注:
    在settings.py文件内的TEMPLATES内的OPTIONS内可以增加一个选项来指定默认值(优先级大于default):
    'string_if_invalid': "默认值",


    2. length

    返回值的长度,作用于字符串和列表.
    语法:value|length


    3. filesizeformat

    将值格式化为一个"人类可读的"文件尺寸.
    语法:value|filesizeformat


    4. slice

    切片
    语法value|slice:"2:-1"


    5. add

    在值的末尾添加指定值,如果全部为数字,则相加.
    语法:value|add:"添加的值"


    6. first、last

    取第一个元素、取最后一个元素.
    可用于循环的时候判断是否为第一个或最后一个值.


    7. join

    使用字符串拼接列表.
    语法:value|join:"字符串"


    8. truncatechars

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾(注意:"..."占3个字符).
    语法:value|truncatechars:9


    9. truncatewords

    在一定数量的字后截断字符串.
    语法:value|truncatewords

    10. date

    日期格式化
    语法:value|date:'Y-m-d H:i:s'

    可格式化输出的字符


    11. safe

    Django的模版中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,是为了安全。

    但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。

    为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器(value|safe)的方式告诉Django这段代码是安全的不必转义。

    例如:value = "<a href='#'></a>"


    12. cut

    移除所有与指定字符相同的字符串.
    语法:value|cut:'空格'


    13. lower、upper、title、ljust、rjust、center

    依次为:全部小写、全部大写、标题化、左对齐、右对齐、居中.


    14. 自定义filter

    自定义过滤器只是带有一个或两个参数的Python函数:

    • 变量(输入)的值:不一定是一个字符串
    • 参数的值: 可以有一个默认值,或完全省略

    例如,在过滤器 {{ var|func:'var' }} 中,过滤器func将传递变量var和参数'bar'.

    自定义filter代码文件存放位置:
    在app下新建一个名为templatetags的package,再在package下面创建自定义filter的文件.

    自定义filter文件写法如下:

    from django import template
    register = template.Library()
    
    @register.filter(name='addSB')
    def add_sb(value):
        return '%s is SB' % value
    

    调用自定义filter:

    {# 先导入自定义的filter文件 #}
    {% load 文件名 %}
    
    {# 使用自定义的filter #}
    {{value|addSB }}
    

    15. Tags

    for
    <ul>
    {% for user in user_list %}
    	<li>{{ user.name }}</li>
    {% endfor %}
    </ul>
    

    for循环可用的一些参数:

    Variable Description
    forloop.cunter 当前循环的索引值(从1开始)
    forloop.cunter0 当前循环的索引值(从0开始)
    forloop.revcounter 当前循环的倒序索引值(从1开始)
    forloop.revcounter0 当前循环的倒序索引值(从0开始)
    forloop.first 当前循环是不是第一次循环(布尔值)
    forloop.last 当前循环是不是最后一次循环(布尔值)
    forloop.parentloop 本层循环的外层循环
    for ... empty
    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% empty %}
        <li>空空如也</li>
    {% endfor %}
    </ul>
    
    if ... else
    {% if user_list|length > 5 %}
      七座豪华SUV
    {% else %}
        黄包车
    {% endif %}
    
    if ... elif ... else
    {% if user_list %}
      用户人数:{{ user_list|length }}
    {% elif black_list %}
      黑名单数:{{ black_list|length }}
    {% else %}
      没有用户
    {% endif %}
    

    if语句支持:and、or、==、>、<、!=、<=、>=、in、not in、is、is not判断.
    但是!Django模版语言不支持连续判断,即不支持以下写法:

    {% if a > b > c %}
    ...
    {% endif %}
    
    with

    定义一个中间变量

    {% with value as v %}
        {{ v }}
    {% endwith %}
    

    16. csrf_token

    用于跨站点请求伪造保护.
    必须写在form表单内部:
    {% csrf_token %}



    三、母板

    示例(母板文件为:base.html,内容如下):

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>Title</title>
      {% block page-css %}
      {% endblock %}
    </head>
    <body>
    
    <h1>这是母板的标题</h1>
    {% block page-main %}
    {% endblock %}
    
    <h1>母板底部内容</h1>
    {% block page-js %}
    {% endblock %}
    </body>
    </html>
    

    注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。


    模版继承

    示例(继承上例的母版):

    {% extends 'base.html' %}
    

    块(block)

    通过在母版中使用 {% block xxx %} 来定义"块".
    在子页面中通过定义母板中的block名来对应替换母版中相应的内容.

    例如:

    {% block page-css %}
    ...
    {% endblock %}
    
    {# 这是母板的标题 #}
    {% block page-main %}
    ...
    {% endblock %}
    
    {# 母板底部内容 #}
    {% block page-js %}
    ...
    {% endblock %}
    


    四、组件

    可以将常用的页面内容,如导航条、页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。

    {% include "文件全名" %}
    

    示例(在base.html文件中导入nav.html文件内的代码):
    在这里插入图片描述



    五、静态文件相关

    从settings文件内获取 STATIC_URL='/static/' 和相对路径进行拼接.

    {% load static %}
    <img src="{% static 'images/hi.jpg' %}" alt="Hi!"/>
    

    引用JS文件时使用:

    {% <script src="{% static 'mytest.js' %}"></script> %}
    

    如果某个文件多处被同时用到,可以存为一个变量:

    {% load static %}
    {% static 'images/hi.jpg' as myphoto %}
    <img src="{{ myphoto }}"><img>
    

    示例(导入bootstrap文件):
    在这里插入图片描述


    使用get_static_prefix

    从settings文件内获取 STATIC_URL='/static/' 和相对路径进行拼接.

    {% load static %}
    <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
    
    # 或者
    
    {% load static %}
    {% get_static_prefix as STATIC_PREFIX %}
    <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
    <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
    

    示例(导入bootstrap文件):
    在这里插入图片描述


    自定义simpletag_tag


    自定义inclusion_tag

    1.在app下创建一个名为 tmplatetags 的python package包.
    2.在包下新建py文件(如:mytags.py)
    3.编辑文件,具体步骤如下:
    在这里插入图片描述



  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/zyk01/p/10176295.html
Copyright © 2011-2022 走看看