Django之模板层

1. 什么是DTL简介

全称:Django模板语言(Django Template Language)
语法:
    filter {{ }}  #变量和过滤
    tag {% %}      #标签

2. 简单的变量的使用:

'''
1.视图函数可以通过两种方式将变量传递给模板页面

    -- render(request, 'test_page.html', locals())
        >>> locals() 就是将视图函数中的所有变量都传递给模板页面

2.模板页面中对变量的使用
    -- 语法:{{ 变量 }}
    -- 支持("全")类型:数字、字符串、布尔、列表、元组、字典、函数、对象、类
    -- 注:list.0 | dic.key | obj.name | obj.fn 来查看内部成员数据
def dtl(request):
    num = 3.14
    ss = 'abc123嘿嘿'
    # return render(request, 'django_dtl.html', {'number': num, 'ss': ss})
    result = True
    list = [1, 2, 3, 4, 5]
    dic = {'name': 'owen', 'age': 28}
    # 函数不能带有参数,模板中{{ fn }} 本质就是调用函数拿到函数值(函数的返回值)
    def fn():
        return "fn function"
    class Person:
        name = "name"
        def __str__(self):
            return "这是Person类"
    p = Person()
    # locals()存放当前作用域中所有的名字
    return render(request, 'django_dtl.html', locals())
'''
'''
<li>{{ num }}</li>
<li>{{ list }} -- {{ list.0 }}</li>
<li>{{ dic }} -- {{ dic.age }}</li>
<li>{{ Person }}</li>  # Person() => __str__的返回值
<li>{{ 123 }}</li>  # 也可以直接写数字、字符串、布尔值
'''
变量的使用
'''
1.语法:
    -- {{ 变量|过滤器1[[:参数]|...|过滤器n[:参数]] }}
    -- 注:过滤器可以串联操作,可以拥有0个或1个参数

2.常见内置filter
    -- 增加   add:num
    -- 字符串长度   length
    -- 默认值   default:'默认值'  # 变量不存在或为空
    -- 全大写   upper
    -- 全小写   lower
    -- 切片   slice:'0:-1'
    -- 将数字转换为文件大小   filesizeformat
    -- 字符串隐藏   truncatechars:13   # 只显示10个字符,后置字符都用...来替代
    -- 时间   date:'Y-m-d'
    -- 转换原意   safe
'''

<hr>
<h2>过滤器</h2>
<ul>
    <li>{{ num|add:1 }}</li>
    <li>{{ ss|length }}</li>
    <li>{{ 150|add:100|add:-50 }}</li>
    <li>{{ 'Abc'|upper|lower }}</li>
    <li>{{ '123456789'|truncatechars:6 }}</li>
    <li>{{ '123456789'|slice:'1:-1' }}</li>
    <li>{{ number|default:"number不存在或值为False" }}</li>
    <li>{{ time|date:'Y年m月d日 h:i:s' }}</li>
    <li>{{ time|safe }}</li>
    <li>{{ link|safe }}</li>
    <li>{{ file_size|filesizeformat }}</li>
</ul>
<hr>
过滤器

3.标签的用法

'''
1.语法:
    -- {% 关键词 arg1 ... argn %}  eg: {% url 'test' 1 2 3 %} => /test/1/2/3/

2.常用:
    -- 反向解析url   {% url 'namespace:url_name' arg1 arg2 %}
    -- 当前时间now   {% now 'Y-m-d' %}
    -- 起别名with   {% with '后面的别名flag就代表我' as flag %} {{ flag }} {% endwith %}
    -- Django CSRF认证   {% csrf_token %}
'''

<h3>标签</h3>
<ul>
    <li>{% url 'test' 1 2 3 %}</li>
    <li>
        {# 起别名 #}
        {% with link|safe as lk %}
            {{ lk }}
            {{ lk }}
            {{ lk }}
        {% endwith %}
        {% with n='123456789' %}
            {{ n }}
            {{ n }}
            {{ n }}
        {% endwith %}
    </li>
    <li>
        {% now 'Y-m-d' %}
    </li>
    <li>
标签的定义

4. 分支的用法

语法:
{% if 条件1 %}
    结论1
{% elif 条件2 %}
    结论2
{% else %}
    结论n
{% endif %}

注:
1. if的条件可以添加filter
2. 可以嵌套

<li>
        {% with 10|add:0 as num %}
        
            {% if num|add:0 > 10 %}
                <p>num值大于10</p>
            {% elif num|add:0 == 10 %}
                <p>num值等于10</p>
            {% else %}
                {% if num|add:0 > 5 %}
                    <p>num介于5与10</p>

                {% else %}
                    <p>num不大于5</p>
                {% endif %}
            {% endif %}
            
        {% endwith %}
    </li>
分支的用法

5.迭代器的前端用法

'''
{% for foo in iterate %}
    {{ forloop }}
{% empty %}
    可迭代对象为空
{% endfor %}

注:
1. iterate为可迭代对象
2. iterate可以添加filter
3. forloop变量为存放迭代信息的字典,父级forloop字典,开始索引从0编号或1编号,倒序索引从0编号或1编号,是否是第一次或最后一次循环
4. empty分支会在可迭代对象不存在或空时执行
'''

<li>
        {% for n in 31425|make_list %}
            <p>{{ forloop }}</p>
            <p>第{{ forloop.counter }}次迭代</p>
            <p>{{ n }}</p>
            <hr>
        {% endfor %}
    </li>
    <li>
        {% for l in ll %}
{#            <p>{{ foo }}</p>#}
{#            <hr>#}
{#            <p>外层第{{ forloop.counter }}循环</p>#}
            {% for n in l %}
{#                <p>内层第{{ forloop.counter }}循环</p>#}
                <p>外层{{ forloop.parentloop.counter }} - 内层{{ forloop.counter }}</p>
                {{ n }}
                <hr>
            {% endfor %}

        {% empty %}
            <p>迭代的ll不存在或为空</p>
        {% endfor %}

    </li>
</ul>
View Code
原文地址:https://www.cnblogs.com/gukai/p/10771193.html