• Django学习之路05


    Django模板层

    模板层语法(两类)

    变量相关:{{      }}

    逻辑相关:{%  %}

    给模板传值的方法

    #方法1
    #通过字典传值,指名道姓,例如下
    return render(request,'reg.html',{'n':n,'f':f})
    
    #方法2
    return render(request,'reg.html',locals())
    #locals()会将它所在名称空间中的所有名字全部传给前端
    #缺点是如果你的前端并不需要那么多数据就会造成资源的浪费

    变量相关

    经过测试,python中的整型,浮点型,字符串,列表,字典,元组以及集合都可以传给前端

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

    补充:也可以传函数名,会自动加括号调用改函数,前端会展示函数调用之后的返回值,如果函数需要传参的话,那么不可以,因为模板语法还不支持。

    模板语法之过滤器

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

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

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

    #length
    {#<p>{{ l|length }}返回值的长度</p>#}
    
    #default
    {#<p>{{ ss|default:'当|左边的变量为空就会返回|右边的值' }}default跟你后端get方法很像</p>#}
    {#<p>{{ ss|default:'' }} default必须要有两个参数</p>#}
    
    #filesizeformat
    {#<p>{{ file_size|filesizeformat }}将值转化成一个文件大小</p>#}
    
    #trunchatewords
    {#<p>{{ info|truncatewords:3 }} 就是按空格截取  三个点不算</p>#}
    
    #truncatechars
    {#<p>{{ info|truncatechars:6 }}按字符截取内容 三个点也算</p>#}
    
    #dare
    {#<p>{{ ctime|date:'Y-m-d' }} 只需要掌握年月日就可以了</p>#}
    
    #add
    {#<p>{{ n|add:100 }}</p>#}
    {#<p>{{ s|add:'hahah 翻车啦' }}加</p>#}
    
    #slice
    {#<p>{{value|slice:"2:1"}}切片,顾头不顾尾,可以规定步长</p>#}
    #safe
    {#<p>{{ xxx|safe }}</p>#}
    {#<p>{{ yyy|safe }}</p>#}
    """
    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,为了在Django中关闭HTML的自动转义,我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
    """

    自定义过滤器

    自定义过滤器只是带有一个或两个参数的Python函数:

    • 变量(输入)的值 - -不一定是一个字符串
    • 参数的值 - 这可以有一个默认值,或完全省略

    例如,在过滤器{{var | foo:'bar'}}中,过滤器foo将传递变量var和参数“bar”

    #自定义顾虑器的存放位置
    app01/
        __init__.py
        models.py
        templatetags/  # 在app01下面新建一个package package
            __init__.py
            app01_filters.py  # 建一个存放自定义filter的文件
        views.py
    #编写自定义过滤器
    from django import template
    register = template.Library()
    
    
    @register.filter(name="cut")
    def cut(value, arg):
        return value.replace(arg, "")
    
    
    @register.filter(name="addSB")
    def add_sb(value):
        return "{} SB".format(value)
    #在前端使用自定义过滤器
    {# 先导入我们自定义filter那个文件 #}
    {% load app01_filters %}
    
    {# 使用我们自定义的filter #}
    {{ somevariable|cut:"0" }}
    {{ d.name|addSB }}

    模板语法之标签

    for循环

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

    关于forloop

    if判断

    {% for foo in '' %}
        {% if forloop.first %}
            <p>这是我的第一次</p>
            {% elif forloop.last %}
            <p>这是最后一次了啊</p>
            {% else %}
            <p>来啊来啊!!!</p>
        {% endif %}
        {% empty %}
        <p>当for循环的对象为空的时候 会走empty</p>
    {% endfor %}

    with

    定义一个中间变量,多用于给一个复杂的变量起别名。

    注意等号左右不要加空格。

    {% with business.employees.count as total %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}

    自定义标签

    # 自定义标签
    # 支持传多个值
    @register.simple_tag(name='jason')
    def xxx(a,b,c,year):
        return '%s?%s|%s{%s'%(a,b,c,year)
    
    # 自定义inclusion_tag
    """
    接收用户传入的参数  然后作用于一个html页面
    在该页面上渲染数据 之后将渲染好的页面
    放到用户调用inclusion_tag的地方
    """
    
    # 自定义inclusion_tag
    @register.inclusion_tag('bigplus.html')
    def bigplus(n):
        l = []
        for i in range(n):
            l.append('第%s项'%i)
        return {'l':l}
    #前端
    <ul>
        {% for foo in l %}
            <li>{{ foo }}</li>
        {% endfor %}
    </ul>

    模板的继承与导入

    #首先需要再被继承的模块中划分多个区域
    {% block 给区域起的名字 %}
    
    {% endblock %}
    
    #通常情况下一个模板中应该至少有三块
    {% block css %}
    页面css代码块
    {% endblock %}
    
    {% block js %}
    页面js代码块
    {% endblock %}
    
    {% block contet %}  #注意起的名字不加引号
        页面主题内容
    {% endblock %}

    子板继承模板

    #先继承模板所有的内容
    {% extends 'home.html' %}
    
    #然后根据block块的名字修改指定区域的内容
    {% block content %}
        <form action="">
        <p>username:<input type="text" class="form-control"></p>
        <p>password:<input type="text" class="form-control"></p>
        </form>
    {% endblock %}

    模板的导入:将一段html当做模块的方式导入另一个html展示

    {%  include '想导入的html文件名' %}
  • 相关阅读:
    Django学习案例一(blog):四. 使用Admin
    Django学习案例一(blog):三. 模型生成数据
    Django学习案例一(blog):二. 连接数据库
    连接Xively云
    undefined reference to `_sbrk', `_write', `_lseek', `_read'
    Android manifest
    关于android socket出现at java.net.DatagramSocket java.net.BindException at libcore.io.IoBridge.bind(IoBridge.java:89)等waring
    virtual box Failed to load unit ""pgm" 的error
    Lwip lwip_recvfrom函数一个数据包不能分多次读取。
    获取Window下的文件缩略图
  • 原文地址:https://www.cnblogs.com/wangnanfei/p/11545065.html
Copyright © 2020-2023  润新知