模板层

1. 常用语法

只需要记两种特殊符号:

{{  }}和 {% %}

变量相关的用{{}},逻辑相关的用{%%}。

2. 变量

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

  常用的数据类型:变量、列表、字典、列表套字典

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

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

              字典查询(Dictionary lookup)
              属性或方法查询(Attribute or method lookup)
              数字索引查询(Numeric index lookup)

【注意事项】

  1. 如果计算结果的值是可调用的,它将被无参数的调用。 调用的结果将成为模版的值。
  2. 如果使用的变量不存在, 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为'' (空字符串) 。
def template_test(request):
    l = [11, 22, 33]
    d = {"name": "alex"}

    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def dream(self):
            return "{} is dream...".format(self.name)

    Alex = Person(name="Alex", age=34)
    Egon = Person(name="Egon", age=9000)
    Eva_J = Person(name="Eva_J", age=18)

    person_list = [Alex, Egon, Eva_J]
    return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})
{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}

3. 过滤器(filter)

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

       过滤器的语法: {{ value|filter_name:参数 }}

       使用管道符"|"来应用过滤器。

       例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。

【注意事项】

  1. 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
  2. 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
  3. 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
  4. '|'左右没有空格没有空格没有空格

{{ name|upper }} # 将名字大写
{{ name|lower }} # 将名字小写
{{ name|first|upper }} # 取出第一个字母并大写
{{ name|title }} # 将名字首字母全部大写
{{ name|truncatewords:'2' }} # this is xxx yyy ====>>> this is ...
{{ ctime|date:"Y-m-d H:i:s" }} # 时间格式
{{ value|default:"nothing"}} # 如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值。
{{ value|length }} # 返回值的长度,作用于字符串和列表。
{{value|slice:"2:-1"}} # 切片

 

{{ value|safe}} value = "<a href='#'>点我</a>"

 

4. 标签(tags)

4.1 for循环

4.1.1 普通for循环

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

4.1.2 for ... empty

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>

4.2 forloop

4.3 if 判断

{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

Django的模板语言不支持连续判断

5. 自定义过滤器和标签(可以理解为前端处理数据)

5.1 自定义过滤器

自定义filter代码文件摆放位置:

app01/
    __init__.py
    models.py
    templatetags/  # 在app01下面新建一个package package(只能这个名字)
        __init__.py
        my_tags.py  # 建一个存放自定义filter的文件
    views.py
from django import template
from django.utils.safestring import mark_safe
 
register = template.Library()   #register的名字是固定的,不可改变
 
 
@register.filter
def filter_multi(v1,v2):
    return  v1 * v2

@register.simple_tag
def simple_tag_multi(v1,v2):
    return  v1 * v2

@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)

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

{% load my_tags %} 

使用simple_tag和filter(如何调用)

# num=12
{{ num|filter_multi:2 }} #24
 
{{ num|filter_multi:"[22,333,4444]" }}
 
{% simple_tag_multi 2 5 %}  参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}

【注意】:filter可以用在if等语句后,simple_tag不可以

{% if num|filter_multi:30 > 100 %}
    {{ num|filter_multi:30 }}
{% endif %}

6. 母版的导入与继承

在母版base.html中写入所有子版都需要的界面, 然后在子版需要添加内容的地方

{%block content%}

{%endblock%}

子版继承母版

{% extends “base.html”%}

{%block content%}    {%endblock%}

7. 组件(可以理解为加载一个局部页面)

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

{% include “html页面” %}  
如:
{% include 'myb.html' %}

 

8. 静态文件相关(inclusion_tag)(可以理解为前端处理页面)

【示例】

templatetags/my_inclusion.py

from django import template

register = template.Library()


@register.inclusion_tag('result.html')
def show_results(n):
    n = 1 if n < 1 else int(n)
    data = ["第{}项".format(i) for i in range(1, n+1)]
    return {"data": data}

 

templates/snippets/result.html

<ul>
  {% for choice in data %}
    <li>{{ choice }}</li>
  {% endfor %}
</ul>

 

templates/index.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>inclusion_tag test</title>
</head>
<body>

{% load inclusion_tag_test %}

{% show_results 10 %}
</body>
</html>

 

posted on 2019-08-03 11:33  软饭攻城狮  阅读(107)  评论(0编辑  收藏  举报

导航