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

    一 模版简介

    你可能已经注意到我们在例子视图中返回文本的方式有点特别。 也就是说,HTML被直接硬编码在 Python代码之中。

    def current_datetime(request):
        now = datetime.datetime.now()
        html = "<html><body>It is now %s.</body></html>" % now
        return HttpResponse(html)

    尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不是一个好主意。 让我们来看一下为什么:

    • 对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。

    • Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。 设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。

    • 程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。

    基于这些原因,将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题

     python的模板:HTML代码+模板语法

    复制代码
    def current_time(req):
        # ================================原始的视图函数
        # import datetime
        # now=datetime.datetime.now()
        # html="<html><body>现在时刻:<h1>%s.</h1></body></html>" %now
    
    
        # ================================django模板修改的视图函数
        # from django.template import Template,Context
        # now=datetime.datetime.now()
        # t=Template('<html><body>现在时刻是:<h1>{{current_date}}</h1></body></html>')
        # #t=get_template('current_datetime.html')
        # c=Context({'current_date':str(now)})
        # html=t.render(c)
        #
        # return HttpResponse(html)
    
    
        #另一种写法(推荐)
        import datetime
        now=datetime.datetime.now()
        return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})
    复制代码

    模版语法重点:

      变量:{{ 变量名 }}

        1 深度查询 用句点符

        2 过滤器

      标签:{{%  % }}

    二 模版语法之变量

    在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法:{{变量名}}

    views.py

    复制代码
    def template_test(request):
        name = 'lqz'
        li = ['lqz', 1, '18']
        dic = {'name': 'lqz', 'age': 18}
        ll2 = [
            {'name': 'lqz', 'age': 18},
            {'name': 'lqz2', 'age': 19},
            {'name': 'egon', 'age': 20},
            {'name': 'kevin', 'age': 23}
        ]
        ll3=[]
        class Person:
            def __init__(self, name):
                self.name = name
    
            def test(self):
                print('test函数')
                return 11
    
            @classmethod
            def test_classmethod(cls):
                print('类方法')
                return '类方法'
    
            @staticmethod
            def static_method():
                print('静态方法')
                return '静态方法'
    
        lqz = Person('lqz')
        egon = Person('egon')
        person_list = [lqz, egon]
        bo = True
        te = test()
        import datetime
        now=datetime.datetime.now()
        link1='<a href="https://www.baidu.com">点我<a>'
        from django.utils import safestring
        link=safestring.mark_safe(link1)
        # html特殊符号对照表(http://tool.chinaz.com/Tools/htmlchar.aspx)
    
        # 这样传到前台不会变成特殊字符,因为django给处理了
        dot='&spades;'
    
    
        # return render(request, 'template_index.html', {'name':name,'person_list':person_list})
        return render(request, 'template_index.html', locals())
    复制代码

    html

    复制代码
    <p>{{ name }}</p>
                <p>{{ li }}</p>
                <p>{{ dic }}</p>
                <p>{{ lqz }}</p>
                <p>{{ person_list }}</p>
                <p>{{ bo }}</p>
                <p>{{ te }}</p>
    
                <hr>
                <h3>深度查询句点符</h3>
                <p>{{ li.1 }}</p>
                <p>{{ dic.name }}</p>
                <p>{{ lqz.test }}</p>
                <p>{{ lqz.name }}</p>
                <p>{{ person_list.0 }}</p>
                <p>{{ person_list.1.name }}</p>
    
                <hr>
                <h3>过滤器</h3>
                {#注意:冒号后面不能加空格#}
                <p>{{ now | date:"Y-m-d H:i:s" }}</p>
    
                {#如果变量为空,设置默认值,空数据,None,变量不存在,都适用#}
                <p>{{ name |default:'数据为空' }}</p>
                {#计算长度,只有一个参数#}
                <p>{{ person_list |length }}</p>
                {#计算文件大小#}
                <p>{{ 1024 |filesizeformat }}</p>
    
                {#字符串切片,前闭后开,前面取到,后面取不到#}
                <p>{{ 'hello world lqz' |slice:"2:-1" }}</p>
                <p>{{ 'hello world lqz' |slice:"2:5" }}</p>
    
                {#截断字符,至少三个起步,因为会有三个省略号(传负数,1,2,3都是三个省略号)#}
                <p>{{ '刘清政 world lqz' |truncatechars:"4" }}</p>
                {#截断文字,以空格做区分,这个不算省略号#}
                <p>{{ '刘清政   是      大帅比 谢谢' |truncatewords:"1" }}</p>
    
                <p>{{ link1 }}</p>
                <p>{{ link1|safe }}</p>
                <p>{{ link }}</p>
    
                <p>&spades;</p>
                <p>{{ dot }}</p>
    
                {#add   可以加负数,传数字字符串都可以#}
                <p>{{ "10"|add:"-2" }}</p>
                <p>{{ li.1|add:"-2" }}</p>
                <p>{{ li.1|add:2 }}</p>
                <p>{{ li.1|add:"2" }}</p>
                <p>{{ li.1|add:"-2e" }}</p>
    
                {#upper#}
                <p>{{ name|upper }}</p>
                <p>{{ 'LQZ'|lower }}</p>
                <hr>
                <h3>模版语法之标签</h3>
                {#for 循环 循环列表,循环字典,循环列表对象#}
                <ui>
                    {% for foo in dic %}
                        {{ foo }}
                    {% endfor %}
                    {#也可以混用html标签#}
                    {% for foo in li %}
                        <ul>foo</ul>
    
                    {% endfor %}
                </ui>
                {#表格#}
                <table border="1">
    
                    {% for foo in ll2 %}
                        <tr>
                            <td>{{ foo.name }}</td>
                            <td>{{ foo.age }}</td>
                        </tr>
                    {% endfor %}
                </table>
                <table border="1">
                    {#'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}#}
                    {% for foo in ll2 %}
                        <tr>
                            <td>{{ forloop.counter }}</td>
                            <td>{{ foo.name }}</td>
                            <td>{{ foo.age }}</td>
                        </tr>
                    {% endfor %}
    
    
                </table>
    
    
    
                {% for foo in ll5 %}
                    <p>foo.name</p>
                {% empty %}
                    <p>空的</p>
                {% endfor %}
    
                <hr>
                <h3>if判断</h3>
                {% if name %}
                    <a href="">hi {{ name }}</a>
                    <a href="">注销</a>
                {% else %}
                    <a href="">请登录</a>
                    <a href="">注册</a>
                {% endif %}
                {#还有elif#}
                <hr>
                <h3>with</h3>
                {% with ll2.0.name as n %}
                    {{ n }}
                {% endwith %}
                {{ n }}
    
    
                {% load my_tag_filter %}
    
                {{ 3|multi_filter:3 }}
    
                {#传参必须用空格区分#}
                {% multi_tag 3 9 10 %}
    
                {#可以跟if连用#}
                {% if 3|multi_filter:3 > 9 %}
                    <p>大于</p>
                {% else %}
                    <p>小于</p>
                {% endif %}
    复制代码

    注意:句点符也可以用来引用对象的方法(无参数方法):

    <h4>字典:{{ dic.name.upper }}</h4>

    三 模版之过滤器

    语法:

    {{obj|filter__name:param}}  变量名字|过滤器名称:变量

    default

    如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:

    1
    {{ value|default:"nothing" }}

    length

    返回值的长度。它对字符串和列表都起作用。例如:

    1
    {{ value|length }}

    如果 value 是 ['a', 'b', 'c', 'd'],那么输出是 4。

    filesizeformat

    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)。例如:

    1
    {{ value|filesizeformat }}

    如果 value 是 123456789,输出将会是 117.7 MB。  

    date

    如果 value=datetime.datetime.now()

    1
    {{ value|date:"Y-m-d" }}  

    slice

    如果 value="hello world"

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

    truncatechars

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

    参数:要截断的字符数

    例如:

    1
    {{ value|truncatechars:9 }}

    safe

    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:

    1
    value="<a href="">点击</a>"
    1
    {{ value|safe}}

    其它过滤器(了解)

    过滤器 描述 示例
    upper 以大写方式输出 {{ user.name | upper }}
    add 给value加上一个数值 {{ user.age | add:”5” }}
    addslashes 单引号加上转义号  
    capfirst 第一个字母大写 {{ ‘good’| capfirst }} 返回”Good”
    center 输出指定长度的字符串,把变量居中 {{ “abcd”| center:”50” }}
    cut 删除指定字符串 {{ “You are not a Englishman” | cut:”not” }}
    date 格式化日期  
    default 如果值不存在,则使用默认值代替 {{ value | default:”(N/A)” }}
    default_if_none 如果值为None, 则使用默认值代替  
    dictsort 按某字段排序,变量必须是一个dictionary {% for moment in moments | dictsort:”id” %}
    dictsortreversed 按某字段倒序排序,变量必须是dictionary  
    divisibleby 判断是否可以被数字整除
    {{ 224 | divisibleby:2 }}  返回 True
    escape 按HTML转义,比如将”<”转换为”&lt”  
    filesizeformat 增加数字的可读性,转换结果为13KB,89MB,3Bytes等
    {{ 1024 | filesizeformat }} 返回 1.0KB
    first 返回列表的第1个元素,变量必须是一个列表  
    floatformat 转换为指定精度的小数,默认保留1位小数 {{ 3.1415926 | floatformat:3 }} 返回 3.142  四舍五入
    get_digit 从个位数开始截取指定位置的数字 {{ 123456 | get_digit:’1’}}
    join 用指定分隔符连接列表 {{ [‘abc’,’45’] | join:’*’ }} 返回 abc*45
    length 返回列表中元素的个数或字符串长度  
    length_is 检查列表,字符串长度是否符合指定的值 {{ ‘hello’| length_is:’3’ }}
    linebreaks 用<p>或<br>标签包裹变量 {{ “Hi David”|linebreaks }} 返回<p>Hi</p><p>David</p>
    linebreaksbr 用<br/>标签代替换行符  
    linenumbers 为变量中的每一行加上行号  
    ljust 输出指定长度的字符串,变量左对齐 {{‘ab’|ljust:5}}返回 ‘ab   ’
    lower 字符串变小写  
    make_list 将字符串转换为列表  
    pluralize 根据数字确定是否输出英文复数符号  
    random 返回列表的随机一项  
    removetags 删除字符串中指定的HTML标记 {{value | removetags: “h1 h2”}}
    rjust 输出指定长度的字符串,变量右对齐  
    slice 切片操作, 返回列表 {{[3,9,1] | slice:’:2’}} 返回 [3,9]
    {{ 'asdikfjhihgie' | slice:':5' }} 返回 ‘asdik’
    slugify 在字符串中留下减号和下划线,其它符号删除,空格用减号替换
    {{ '5-2=3and5 2=3' | slugify }} 返回 5-23and5-23
    stringformat 字符串格式化,语法同python  
    time 返回日期的时间部分  
    timesince 以“到现在为止过了多长时间”显示时间变量 结果可能为 45days, 3 hours
    timeuntil 以“从现在开始到时间变量”还有多长时间显示时间变量  
    title 每个单词首字母大写  
    truncatewords 将字符串转换为省略表达方式
    {{ 'This is a pen' | truncatewords:2 }}返回
    This is ...
    truncatewords_html 同上,但保留其中的HTML标签
    {{ '<p>This is a pen</p>' | truncatewords:2 }}返回
    <p>This is ...</p>
    urlencode 将字符串中的特殊字符转换为url兼容表达方式 {{ ‘http://www.aaa.com/foo?a=b&b=c’ | urlencode}}
    urlize 将变量字符串中的url由纯文本变为链接  
    wordcount 返回变量字符串中的单词数  
    yesno 将布尔变量转换为字符串yes, no 或maybe
    {{ True | yesno }}
    {{ False | yesno }}
    {{ None | yesno }}
    返回 
    yes
    no 
    maybe

    四 模版之标签

    标签看起来像是这样的: {% tag %}。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})。

    for标签

    遍历每一个元素:

    {% for person in person_list %}
        <p>{{ person.name }}</p>
    {% endfor %}

    可以利用{% for obj in list reversed %}反向完成循环。

    遍历一个字典:

    {% for key,val in dic.items %}
        <p>{{ key }}:{{ val }}</p>
    {% endfor %}

    注:循环序号可以通过{{forloop}}显示  

    复制代码
    forloop.counter            The current iteration of the loop (1-indexed) 当前循环的索引值(从1开始)
    forloop.counter0           The current iteration of the loop (0-indexed) 当前循环的索引值(从0开始)
    forloop.revcounter         The number of iterations from the end of the loop (1-indexed) 当前循环的倒序索引值(从1开始)
    forloop.revcounter0        The number of iterations from the end of the loop (0-indexed) 当前循环的倒序索引值(从0开始)
    forloop.first              True if this is the first time through the loop 当前循环是不是第一次循环(布尔值)
    forloop.last               True if this is the last time through the loop 当前循环是不是最后一次循环(布尔值)
    forloop.parentloop 本层循环的外层循环
    复制代码

    for ... empty

    for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

    {% for person in person_list %}
        <p>{{ person.name }}</p>
    
    {% empty %}
        <p>sorry,no person here</p>
    {% endfor %}

    if 标签

    {% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

    复制代码
    复制代码
    {% 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判断。

    with

    使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的

    例如:

    {% with total=business.employees.count %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}
    不要写成as

    csrf_token

    {% csrf_token%}

    这个标签用于跨站请求伪造保护

    五 自定义标签和过滤器

    1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

    2、在app中创建templatetags模块(模块名只能是templatetags)

    3、创建任意 .py 文件,如:my_tags.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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
    <br>
    @register.simple_tag
    def simple_tag_multi(v1,v2):
        return  v1 * v2
    <br>
    @register.simple_tag
    def my_input(id,arg):
        result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
        return mark_safe(result)

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

    1
    {% load my_tags %} 

    5、使用simple_tag和filter(如何调用)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -------------------------------.html
    {% load xxx %}  
          
    # 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 %}

    六 模版导入入和继承

    模版导入:

      语法:{% include '模版名称' %}

      如:{% include 'adv.html' %}

     adv.html
     base.html
     order.html

    模版继承

    Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

    通过从下面这个例子开始,可以容易的理解模版继承:

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <link rel="stylesheet" href="style.css"/>
        <title>{% block title %}My amazing site{% endblock %}</title>
    </head>
    
    <body>
    <div id="sidebar">
        {% block sidebar %}
            <ul>
                <li><a href="/">Home</a></li>
                <li><a href="/blog/">Blog</a></li>
            </ul>
        {% endblock %}
    </div>
    
    <div id="content">
        {% block content %}{% endblock %}
    </div>
    </body>
    </html>
    复制代码

    这个模版,我们把它叫作 base.html, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks。

    在这个例子中, block 标签定义了三个可以被子模版内容填充的block。 block 告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置。

    子模版可能看起来是这样的:

    复制代码
    {% extends "base.html" %}
     
    {% block title %}My amazing blog{% endblock %}
     
    {% block content %}
    {% for entry in blog_entries %}
        <h2>{{ entry.title }}</h2>
        <p>{{ entry.body }}</p>
    {% endfor %}
    {% endblock %}
    复制代码

    extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。

    那时,模版引擎将注意到 base.html 中的三个 block 标签,并用子模版中的内容来替换这些block。根据 blog_entries 的值,输出可能看起来是这样的:

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <link rel="stylesheet" href="style.css" />
        <title>My amazing blog</title>
    </head>
     
    <body>
        <div id="sidebar">
            <ul>
                <li><a href="/">Home</a></li>
                <li><a href="/blog/">Blog</a></li>
            </ul>
        </div>
     
        <div id="content">
            <h2>Entry one</h2>
            <p>This is my first entry.</p>
     
            <h2>Entry two</h2>
            <p>This is my second entry.</p>
        </div>
    </body>
    </html>
    复制代码

    请注意,子模版并没有定义 sidebar block,所以系统使用了父模版中的值。父模版的 {% block %} 标签中的内容总是被用作备选内容(fallback)。

    这种方式使代码得到最大程度的复用,并且使得添加内容到共享的内容区域更加简单,例如,部分范围内的导航。

    这里是使用继承的一些提示

    • 如果你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作。

    • 在base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。

    • 如果你发现你自己在大量的模版中复制内容,那可能意味着你应该把内容移动到父模版中的一个 {% block %} 中。

    • If you need to get the content of the block from the parent template, the {{ block.super }} variable will do the trick. This is useful if you want to add to the contents of a parent block instead of completely overriding it. Data inserted using {{ block.super }} will not be automatically escaped (see the next section), since it was already escaped, if necessary, in the parent template.

    • 为了更好的可读性,你也可以给你的 {% endblock %} 标签一个 名字 。例如:

      1
      2
      3
      {% block content %}
      ...
      {% endblock content %}  

      在大型模版中,这个方法帮你清楚的看到哪一个  {% block %} 标签被关闭了。

    • 不能在一个模版中定义多个相同名字的 block 标签。

    七 静态文件相关

    {% 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>

    使用get_static_prefix

    {% 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!" />

    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

    按 Ctrl+C 复制代码
    按 Ctrl+C 复制代码
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     


    昨日回顾:
    1 虚拟环境
    -1 pycharm里创建
    -2 用命令串讲
    2 视图层:
    1 Request对象---GET,POST,method,body,FILES,META,path(只是路径),get_full_path(拿到全路径,带数据),
    2 HttpResponse对象--->render,redirect,HttpResponse,JsonResponse(返回json格式)
    3 反向解析--->在视图层:本质为了去除地址,重定向来用;在模板层:取出地址,为了发请求来用
    4 JsonResponse:JsonResponse(dic,json_dumps_params={'ensure_ascii':False})---中文显示编码问题
    5 FBV和CBV
    from django.views import View
    class Test(View)
    def get(self,request):
    pass
    def post(self,request):
    pass
    6 django 2.0的path,re_path
    1 re_path跟原来的url一毛一样
    2 path:准确路径
    3 path 内置转换器:5个 int,str,path....用法:<int:year>
    4 自定义转换器:
    <yyy:year>

    7 文件上传
    1 html页面上指定编码格式:enctype="multipart/form-data"
    2 视图层:request.FILES(字典),可以根据名字,把文件取出来
    -myfile=request.FILES.get('文件名字')--->得到文件对象
    3 for循环文件对象,保存到本地,文件名字:myfile.name


    今日内容:(模板层)
    1 模版语法之变量:详见源码
    -{{ 变量 }}:******重要******{#相当于print了该变量#}
    -深度查询---->统一都用句点符 .

    2 模版之过滤器
    -语法:{{第一个参数|过滤器名字:第二个参数}}
    -常用过滤器:(详细用法见源码)
    -length
    -default
    -slice
    -date
    -filesizeformat
    -truncatechars
    -truncatewords
    -safe
    -add
    3 模版之标签
    -{% 标签 %}
    -for:forloop:对象(里面有好多东西:parentloop,last,first,counter....)忘记的话, 自己打印一下
    empty:被循环的对象是空,才走它
    for循环可以嵌套,也可以用if
    -if:
    {% if forloop.first %}
    <p>第一次的我 </p>
    {% elif forloop.last %}
    <p>最后的我 </p>
    {% else %}
    <p>{{ foo }}</p>吧
    {% endif %}
    -with:重命名,应用在变量名过长
    ********都要有结束********

    4 自定义标签和过滤器
    --***标签不能用在if判断,过滤器,可以用在if判断
    -自定义过滤器
    -1 先app是不是已经在setting中注册
    -2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块)
    -3 在模块下创建一个py文件,名字随意:mytag.py
    -4 # 第一步,导入template
    from django.template import Library
    # 第二步,定义一个叫register的变量=template.Library()
    register = Library()
    -5 写一个函数,用@register.filter(name='yyy')装饰一下(可以指定别名)
    def str_add(str1, str2): #一定要有返回值
    # 业务逻辑很复杂
    return str1 + str2
    -6 在模板里:(新定定义的标签,过滤器,都要重启程序)
    -{% load mytag %}
    -{{'lqz'|str_add:'nb'}}
    -自定义标签:
    -1-4:前4步,根过滤器的定义完全一样
    -5 只是装饰器不一样
    @register.simple_tag()
    def add_nb(value):
    return value+'nb'
    -6 在模板里:(多个参数,以空格区分)
    -{% load mytag %}
    -{% add_nb 'lqz'%}


    作业:
    1 模板语法:上课讲的,回去敲一遍(整理到博客上)
    2 常用的过滤器,自己敲一遍
    3 自定义一个过滤器:length,add(支持数字,字符串,数字字符串),
    -拓展:safe
    4 自定义标签:详见下午

    5 自定义一个标签: 操--->爱你
    傻逼--->亲爱的
    1 写一个页面:录入对应关系
    2 写一个标签,传入大段文字,如果有要替换的内容,就替换
    3 最低要求,可以在setting里配置:






    '我是个大帅哥,我对面都是一群可爱的人,我是个大帅哥,我对面都是一群傻逼'

  • 相关阅读:
    导出表格,导出表格为excel,导出表格带样式,怎么导出表格数据为excel并且带样式呢
    webpack打包文件 可以npm cdn使用
    Webpack的externals的使用
    如何在微信小程序中使用iconfont
    如何发布和取消发布 NPM 包?
    js中数组对象去重的方法
    小程序列表性能优化
    wepy全局拦截器
    js中prototype与__proto__的关系详解
    JavaScript中本地对象、内置对象和宿主对象
  • 原文地址:https://www.cnblogs.com/fushaunglin/p/9946441.html
Copyright © 2011-2022 走看看