zoukankan      html  css  js  c++  java
  • Django 模板

    Django模板系统
    常用语法
    {{ }}和 {% %}
    变量相关的用{{}},逻辑相关的用{% %}。

    变量
    {{ 变量名 }}
    变量名由字母数字和下划线组成。
    点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。

    模板中支持的写法:
    {# 取l中的第一个参数 #}
    {{ l.0 }}
    {# 取字典中key的值 #}
    {{ d.name }}
    {# 取对象的name属性 #}
    {{ person_list.0.name }}
    {# .操作只能调用不带参数的方法 #}
    {{ person_list.0.dream }}

    Filters
    语法: {{ value|filter_name:参数 }}
    '|'左右没有空格没有空格没有空格

    default #默认
    {{ value|default: "这个变量没有传值就使用默认值"}}
    如果value值没传的话就显示default后面定义的默认参数

    length #长度
    {{ value|length }}
    返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

    filesizeformat #格式化大小
    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
    {{ value|filesizeformat }}
    如果 value 是 123456789,输出将会是 117.7 MB。

    slice #切片
    把字符串按冒号右边规则切片
    {{value|slice:"2:-1"}}

    date #时间格式化
    根据冒号右边格式进行时间格式化
    {{ value|date:"Y-m-d H:i:s"}}

    safe #告诉浏览器安全
    浏览器上显示a标签样式
    value = "<a href='#'>点我</a>"
    {{ value|safe}}

    truncatechars #字符过多截断
    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
    参数:截断的字符数
    {{ value|truncatechars:9}}

    自定义filter
    1、先在app下定义文件夹templatetags,然后建一个存放自定义filter的文件
    app01/
    __init__.py
    models.py
    templatetags/ # 在app01下面新建一个package package
    __init__.py
    app01_filters.py # 建一个存放自定义filter的文件
    views.py
    2.先在自定义的文件中导入
    from django import template
    register = template.Library()
    然后定义函数,@register.filter(name="cut")装饰器用来给filter名命,此例名命cut,
    一个参数,那就是管道符前面的参数
    如果有两个参数,第一个参数就是管道符前面的值,后面的参数就是管道符后面方法内的参数
    @register.filter(name="cut")
    def cut(value, arg):
    return value.replace(arg, "")

    Tags
    if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
    Django的模板语言中属性的优先级大于方法
    Django的模板语言不支持连续判断
    Variable Description
    forloop.counter 当前循环的索引值(从1开始)
    forloop.counter0 当前循环的索引值(从0开始)
    forloop.revcounter 当前循环的倒序索引值(从1开始)
    forloop.revcounter0 当前循环的倒序索引值(从0开始)
    forloop.first 当前循环是不是第一次循环(布尔值)
    forloop.last 当前循环是不是最后一次循环(布尔值)
    forloop.parentloop 本层循环的外层循环

    for ... empty
    如果for循环中什么都没有,则执行empty下的代码
    <ul>
    {% for user in user_list %}
    <li>{{ user.name }}</li>
    {% empty %}
    <li>空空如也</li>
    {% endfor %}
    </ul>

    with
    定义一个中间变量,有时候变量太长用with,赋值,然后再with内就可以用被赋值的代替赋值的
    {% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
    {% endwith %}

    csrf_token
    这个标签用于跨站请求伪造保护。
    在页面的form表单里面写上{% csrf_token %}


    母版和继承
    1. 为什么要有模板和继承:
    把多个页面公用的部分提取出来,放在一个 母版 里面。
    其他的页面只需要 继承 母版就可以了。
    2. 具体使用的步骤:
    1. 把公用的HTML部分提取出来,放到base.html文件中
    2. 在base.html中,通过定义block,把每个页面不同的部分区分出来
    3. 在具体的页面中,先继承母版
    4. 然后block名去指定替换母版中相应的位置

    3. 使用母版和继承的注意事项:
    1. {% extends 'base.html' %} --> 母版文件:base.html要加引号
    2. {% extends 'base.html' %}必须放在子页面的第一行!!!
    3. 可以在base.html中定义很多block,通常我们会额外定义page-css和page-js两个块
    4. view.py相应的函数中返回的是对应的子页面文件 不是不是不是 base.html

    继承母板:
    {% extends '模板文件' %}

    块(block)
    通过在母板中使用{% block xxx %}来定义"块"。
    在子页面中通过定义母板中的block名来对应替换母板中相应的内容。
    {% block page-main %}
    <p>世情薄</p>
    <p>人情恶</p>
    <p>雨送黄昏花易落</p>
    {% endblock %}

    {% block page-css %}
    用于导入独自的css文件
    {% endblock %}

    {% block page-js %}
    用于导入独自的js文件
    {% endblock %}

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

    静态文件相关
    {% load static %}
    <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
    引用JS文件时使用:

    {% load static %}
    <script src="{% static "mytest.js" %}"></script>
    某个文件多处被用到可以存为一个变量

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

    自定义simpletag
    和自定义filter类似,只不过接收更灵活的参数。
    定义注册simple tag

    @register.simple_tag(name="plus")
    def plus(a, b, c):
    return "{} + {} + {}".format(a, b, c)

    使用自定义simple tag
    {% load app01_demo %}
    {# simple tag #}
    {% plus "1" "2" "abc" %}

    inclusion_tag
    多用于返回html代码片段

    示例:

    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 %} # load 后面跟的是py文件名

    {% show_results 10 %} #函数名加参数
    </body>
    </html>



  • 相关阅读:
    数据结构 字符串的长度
    滚动条
    git push 一直卡在 writing objects 然后 就提交失败 提示:unexpected-disconnect-while-reading-sideband-packet
    vue中的防抖和节流
    html5中output元素详解
    手写 apply call bind 三个方法
    js中的陷阱!!!
    display:inline-block元素之间空隙的产生原因和解决办法
    git push到Gitee的时候上传不成功,可能是本地文件夹与远程仓库不同步
    axios没有实现jsonp这个功能,基于axios自己扩展一个
  • 原文地址:https://www.cnblogs.com/yangli0504/p/9269931.html
Copyright © 2011-2022 走看看