• Django之模板层


    常用语法

    只需要记两种特殊符号就行了

    跟变量相关{{}}

    跟逻辑相关{%%}

    Django模板语法取值时都是通过点方法取值

    {{ author_obj.pk }}

    如果后端传入一个列表过来,我们也可以通过点方法取出列表中的值

    {% for book_all in book_all_list %}
                <tr>
                    <td>{{book_all.0.title}}</td>
                    <td>{{ book_all.0.price }}</td>
                    <td>{{ book_all.1 }}</td>
                    <td>{{ book_all.2 }}</td>
                    <td>
                        <a href="{% url 'delete_book' book_all.0.pk %}" class="btn btn-danger">删除</a>
                        <a href="{% url 'update_book' book_all.0.pk %}" class="btn btn-primary">编辑</a>
                    </td>
                </tr>
            {% endfor %}

    过滤器(Filters)

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

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

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

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

    注意事项:

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

    如果把函数作为变量,前端会打印函数的返回值,但是函数无法传值

    length

    {{ l|length }}

    可以统计容器类型长度,但不能统计数字类型

     

    default

    {{ f|default:'你是真的蠢' }}

    如果f变量值为False,或者为空,f的值为default后面的值

    filesizeformat

    {{ n|filesizeformat }}

    在前端打印的是文件大小形式

    truncatechars

    {{ s|truncatechars:3 }}

    truncatechars后面跟的是3的话,只会打印3个小数点,

    比如truncatechars:x会在前端x个字符,但是会打印三个小数点,所以打印的真正文本就x-3

    truncatewords

    {{ s|truncatewords:3 }}

    truncatewords与truncatechars不同

    truncatewords后面的3,表示的是以文本中三个空格隔开数据,但是后面也会跟三个小数点

    date

    格式化时间,我们先从后端传一个时间对象过来

    {{ ctime|date:'Y-m-d' }}

     一般情况用到年月日就可以了

    {{ ctime|date:'Y-m-d H-i-s' }}

    显示年月日时分秒

     safe

    如果我们后端写了前端代码,反到前端,只会是一串字符串,不会是html代码,这是为了脚本攻击,我们也可以通过safe方法和mark_safe解决

    使用这两个方法,就可以让前端使用后端传来的html代码

     后端使用mark_safe标记这段html代码是安全的,作为一个全栈开发工程师,这个还是要了解的

     

     我们也可以像这样使用safe,从后端返回一个html代码的字符串,在html文件中使用safe方法

    cut

    移除value中所有的与给出的变量相同的字符串

    {{ value|cut:' ' }}

    如果value为'i love you',那么将输出'iloveyou'.

    join

    使用字符串连接列表,例如Python的str.join(list)

    timesince

    将日期格式设为自该日期起的时间(例如,“4天,6小时”)。

    采用一个可选参数,它是一个包含用作比较点的日期的变量(不带参数,比较点为现在)。 例如,如果blog_date是表示2006年6月1日午夜的日期实例,并且comment_date是2006年6月1日08:00的日期实例,则以下将返回“8小时”:

    {{ blog_date|timesince:comment_date }}

    分钟是所使用的最小单位,对于相对于比较点的未来的任何日期,将返回“0分钟”。

    timeuntil

    似于timesince,除了它测量从现在开始直到给定日期或日期时间的时间。 例如,如果今天是2006年6月1日,而conference_date是保留2006年6月29日的日期实例,则{{ conference_date | timeuntil }}将返回“4周”。

    使用可选参数,它是一个包含用作比较点的日期(而不是现在)的变量。 如果from_date包含2006年6月22日,则以下内容将返回“1周”:

    {{ conference_date|timeuntil:from_date }}

    slice

    切片

    {{value|slice:"2:-1"}}

    可以支持步长

    标签

                  {#{% for foo in l %}#}
                        {#    <p>{{ forloop }}</p>#}
                        {#{% endfor %}#}
                        {##}
                        {##}
                        {#{% if 'xxx' %}#}
                        {#<p>xxx条件为true</p>#}
                        {#    {% else %}#}
                        {#    <p>xxx条件为false</p>#}
                        {#{% endif %}#}
    
                        {##}
                        {#{% for foo in l %}#}
                        {#    {% if forloop.first %}#}
                        {#        <p>这是我的第一次</p>#}
                        {#        {% elif forloop.last %}#}
                        {#        <p>这是最后一次了啊</p>#}
                        {#        {% else %}#}
                        {#        <p>来啊来啊!!!</p>#}
                        {#    {% endif %}#}
                        {#    {% empty %}#}
                        {#    <p>当for循环的对象为空的时候 会走empty</p>#}
                        {#{% endfor %}#}
    
                        {##}
                        {#<p>#}
                        {#    django模板语法在取值的时候 统一使用句点符(大白话就是 点号   .)#}
                        {#    {% with l.6.3.name as ttt %}  可以给一个比较复杂的取值操作取一个别名 之后在with语句中 就可以使用该别名#}
                        {#        {{ ttt }}#}
                        {#        {{ l.6.3.name }}#}
                        {#    {% endwith %}#}
                        {#</p>#}
    
    
                        {% for foo in d.keys %}
                            <p>{{ foo }}</p>
                        {% endfor %}
                        {% for foo in d.values %}
                            <p>{{ foo }}</p>
                        {% endfor %}
                        {% for foo in d.items %}
                            <p>{{ foo }}</p>
                        {% endfor %}
                
                    for循环里面的forloop对象
                    if判断

    自定义标签 过滤器 inclusion_tag


      自定义固定的三步走战略:
      1.必须在你的应用下新建一个名为templatetags文件夹
      2.在该文件夹内新建一个任意名称的py文件
      3.在该py文件中固定先写下面两句代码

    from  django import template
                            
    register = template.Library()
    # 自定义一个简易版本|add过滤器
    @register.filter(name='add')
    def index(a, b):
        try:
            return int(a) + int(b)
        except BaseException:
            return str(a) + str(b)

    在模板层如何使用自定义过滤器呢?

     在模板层加载templatetags文件夹下的自定义py文件

    就可以使用自定义过滤器了

    自定义标签

    simple_tag

    # 自定义标签
    @register.simple_tag(name='tank')
    def index(a, s, d, f, year):
        return a+s+d+f+year

    在模板层使用

    {% load mybaby %}
    {%tank 1 2 3 4 year=5 %}

    支持关键字传参

    inclusion_tag

    app01/templatetags/mybaby.py

    template/111.html

     template/test.html

    inclusion_tag就是我们先在mybaby中定义inclusion_tag,然后在test.html文件调用的时候,我们去111.html文件中产生一小块html代码,然后直接拿到test.html中使用

    """
    接收用户传入的参数 然后作用于一个html页面
    在该页面上渲染数据 之后将渲染好的页面
    放到用户调用inclusion_tag的地方
    """

    模板的继承
    当多个页面整体的样式都大差不差的情况下 可以设置一个模板文件
    在该模板文件中 使用block块划分多个预期
    之后子版在使用模板的时候 可以通过block块的名字 来选定到底需要修改哪一部分区域

    模板一般情况下 应该至少有三个可以被修改的区域
    {% block css %}
    子页面自己的css代码
    {% endblock %}


    {% block content %}
    子页面自己的html代码
    {% endblock %}


    {% block js %}
    子页面自己的js代码
    {% endblock %}



    # 模板的继承 使用方式
    {% extends 'home.html' %}

    {% block css %}
    <style>
    h1 {
    color: red;
    }
    </style>
    {% endblock %}

    {% block content %}
    <h1>登陆页面</h1>
    <form action="">
    <p>username:<input type="text" class="form-control"></p>
    <p>password:<input type="text" class="form-control"></p>
    <input type="submit" class="btn btn-danger">
    </form>
    {% endblock %}


    {% block js %}

    {% endblock %}


    # 一般情况下 模板上的block越多 页面的可扩展性就越强



    模板的导入
    {% include 'beautiful.html' %}


    当你写了一个特别好看的form表单/列表标签等
    可以将它当成一个模块 哪个地方需要 就直接导入使用即可

  • 相关阅读:
    go语言从例子开始之Example22.协程之通道
    go语言从例子开始之Example21.协程
    go语言从例子开始之Example20.错误处理
    go语言从例子开始之Example19.接口
    级联复制改成主从复制
    一主二从改成级联复制架构步骤
    mysql8.0 备分常用命令
    mysql8基于gtid导出导入搭建主从
    MySQL 8.0 配置mysql_native_password身份验证插件的密码
    mysql_config_editor 安全登录方式
  • 原文地址:https://www.cnblogs.com/asdaa/p/11545221.html
Copyright © 2020-2023  润新知