zoukankan      html  css  js  c++  java
  • django之模板系统 --》内容(filter过滤器、tags标签【for、if、with】、母板以及继承、crf_token、注释、组件、静态文件【load static】、get_static_prefix、自定义标签和tag)

    常用:

    Django模板中只需要记两种特殊符号:
    
    {{  }}和 {% %}
    
    {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作。

    变量

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

    注意:当模板系统遇到一个(.)时,会按照如下的顺序去查询:

    1. 在字典中查询,比如下图的items 
    2. 属性或者方法,先找属性再找方法:例如下图的dream
    3. 数字索引
     

    例子

    Filters过滤器

    方法: 说明
    {{ value|default:"nothing"}}
    如果value值没传的话就显示nothing
    {{ value|filesizeformat }}
    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
    {{ value|add:"2" }}
    value是数字4,则输出结果为6。相加的意思,如何两者都是列表,则进行拼接
    {{ value|lower }}
    变成小写
    {{ value|upper}}
    变成大写
    {{ value|length }} 返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.
    {{value|slice:"2:-1"}}
    切片
    {{ value|first }}
    取第一个元素
    {{ value|last }}
    取最后一个元素
    {{ value|join:" // " }}
    使用指定字符串拼接
    {{ value|truncatechars:9}}
    截断的字符串将以可翻译的省略号序列(“...”)结尾。它的数字等于你要显示的长度+3
     
    {{ value|date:"Y-m-d H:i:s"}}
    日期格式化,也可以设置settings里面:
    USE_L10N=False
    DATETIME_FORMAT='Y-m-d H:m:s'
     
    {{ value|safe}}
     如果有html标签就会转化
     {{value|truncatewrods:2}}  截断的字符串只显示两个单词

     下面看看例子截图:

    对于在网页中输入带有html标签的页面,除了在.html的模板文件中使用{{value|safe}}之外,还有其他方式 mark_safe

    在自定义的标签中 my_filter_tag.py
    from django import template
    from django.utils.safestring import mark_safe
    register=template.Library()
    
    @register.filter
    def link_tag(href):
        # return mark_safe("<a href=/%s>click</a>"% href) #访问路径变成 http://127.0.0.1:8000/www.baidu.com
        return mark_safe("<a href=%s>click</a>" % href)   #变成 http://127.0.0.1:8000/index/www.baidu.com
    在模板文件中使用
    <p>{% load my_filter_tag %}</p>
    <p>{{ "www.baidu.com"|link_tag }}</p> #根据上面的两种方式,他们的结果不一样

    Tags:标签

    for##############################

    for ... empty:有数据就显示,没有就显示empty下面的东西

     for遍历字典的情况

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

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

    forloop.counter         从1开始计数
    forloop.counter0       从0开始基数
    forloop.revcounter    倒序到1结束
    forloop.revcounter0  倒序到0结束
    forloop.first              是一个布尔值,如果该迭代是第一次执行,那么它被置为True
    forloop.last               是一个布尔值,如果该迭代是最后一次执行,那么它被置为True
    forloop说明

    forloop例子

    <p>
        {% for key,val in female_star.items %}
        <span>序号:{{ forloop.counter }} {{ key }}:{{ val }}</span><br/>
        {% endfor %}
    </p>

    if#####################################

    {% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
    例如:未登录时显示登陆和注册,登陆时显示 注销和修改密码
    <div> {% if login_user %} <p>{{ login_user.name }}</p> <a href="">注销</a> <a href="">修改密码</a> {% else %} <a href="">登陆</a> <a href="">注册</a> {% endif %} </div>

     with##########################################

    with用来定义一个中间变量
    例如
    {% with total=business.employees.count %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}
    
    

     母板以及继承

    当一个模板的页面和另外一个几乎相同时,可以考虑使用母板

    如果在母模块的block里面有内容呢,那么,子模板想使用时可以使用:{{block.super}}

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p>this is a test</p>
    {% block content %}
        <h1>母模板内容1</h1>
        <h3>母模板内容2</h3>
    {%  endblock %}
    </body>
    </html>
    index.html

    下面时子模板调用

    {%  extends  'index.html' %}
    
    {% block content %}
        <p>子模板的内容</p>
        {{ block.super }}
    {%  endblock %}
    son.html

     crf_token 

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

    还记得settings里面的设置吗有一句话注释掉了,
    'django.middleware.csrf.CsrfViewMiddleware',

    如果不注释,提交表单的时候报错如下截图

    如何解决呢,加入{% csrf_token %}

    效果:在form表单中加入一个隐藏的input标签,name="csrfmiddlewaretoken" value是64位长度的字符串,就可以提交post请求了

     注释

    {# ... #}

    组件:将一个页面当成一个独立的部分传给其他页面

    使用方法:

    {% include 'nav.html' %}

    例如:

     静态文件相关:使用{% load static %}来灵活配置

    在settings里面有个静态文件的设置

    STATIC_URL = '/static/' #如果这个名称改了,后面的路径就有问题了,那么怎么去灵活修改呢,即使static改成 static111,后面的都不要修改了
    STATICFILES_DIRS=[
        os.path.join(BASE_DIR,'static'),
    格式如下:
    {% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
    使用
    {% load static %} #在顶端加载
    <script src="{% static "mytest.js" %}"></script> 在相关位置处使用
    多处使用可以设置个名称
    {% load static %}
    {% static "images/hi.jpg" as myphoto %}
    <img src="{{ myphoto }}"></img>

    get_static_prefix:打印静态文件的前缀

    例如:

    自定义tag : simple_tag 注意:要重启project

    自定义标签要注意几个地方:

    1  在app01目录下建的目录必须是 templatetags
    2 在templatetags下面建的可以是任意名称的.py 文件
    3 在这个py文件中导入模块,并实例化,并且在函数上面使用 register.simple_tag
      from django import template
      @register.simple_tag
    4 在模板 html文件中使用时 {% load 标签名 %},然后使用例如:{% 函数名 "参数1" "参数2" ... %}

    自定义过滤器:大致和标签类似

    区别:
    py文件中:
    from django  import template
    register=template.Library()
    
    @register.filter
    def multi_filter(x,y): return x*y
    在.html文件中使用
    {% load my_filter_tag %}  #my_filter_tag是py文件名
    <p>{{ num|multi_filter:5 }}</p>
     
    自定义标签和自定义过滤器的区别:
    
    1. 标签,是为了做一些功能。过滤器,是对斜杠前面的数据做过滤。
    
    2. 标签可以写任意个形参,而过滤器最大只能写2个形参。如果过滤器需要接收多个参数,需要将参数存放在列表,元组,字典等数据中。
    
    3. 过滤器可以用在if等语句后,标签不可以

     自定义标签自定义过滤器的混合使用

    inclusion_tag:自定义带有html的代码片段,这里就不在讲解

  • 相关阅读:
    线索二叉树的构建和遍历------小甲鱼数据结构和算法
    小甲鱼数据结构和算法-----二叉树的构建和前序遍历
    python爬虫爬取煎蛋网妹子图片
    C语言实现汉诺塔问题
    C语言实现中缀表达式转后缀表达式
    深度优先算法--判断迷宫的一个起点能否到达一个终点
    python 爬取36K新闻
    栈的操作实现逆波兰表达式的计算
    python 实现汉诺塔问题
    【POJ 3258】River Hopscotch
  • 原文地址:https://www.cnblogs.com/mmyy-blog/p/9828692.html
Copyright © 2011-2022 走看看