• django 之模板层


    1. 模板语法之变量

    • 格式:{{ 变量名 }}
      句点符,深度查询(可以点到方法,不要加括号,只能是无参的方法)
    • 代码
    视图函数:
    from django.shortcuts import render
    from django.utils.safestring import mark_safe
    class Person:
        def __init__(self,name):
            self.name=name
        @classmethod
        def class_test(cls):
            print('class method')
            return 'class method'
        def test(self):
            print('method')
            return self.name
        # def __str__(self):
        #     return self.name
    def index(request):
        ss='lqz is big'
        i=20
        ll=['lqz',18,[1,2,[2,3]]]
        ll4=[[1,2,3],[2,3,4],[1,2,9]]
        dic={'name':'lqz','age':18,'t':[1,2,[2,3]]}
        b=True
        lqz=Person('lqz')
        egon=Person('egon')
        xiaohou=Person('xiaohou')
        monkey=Person('monkey')
        ll2=[lqz,egon,xiaohou,monkey]
        dic2={'lqz':lqz,'egon':egon}
        # print(lqz.class_test())
        # print(dic['name'].upper)
        ll3=[]
        ss2=''
        ss3='<a href="https://www.baidu.com">点我</a>'  #链接
        ss3=mark_safe(ss3) #不用转义网页正常显示
        import datetime
        now=datetime.datetime.now()
        file=1024*1024*1024
        return render(request,'index.html',locals()) #locals渲染所有的内容
        # return render(request,'index.html',{'ss':ss,}) #指定单个内容渲染
    模板:
    <body>
    <hr>
    <p>字符串:{{ ss }}</p>
    <p>数字:{{ i }}</p>
    <p>列表:{{ ll }}</p>
    句点符,做深度查询
    <p>列表第2个值:{{ ll.2.2.0}}</p>
    <p>布尔类型:{{ b}}</p>
    <p>字典:{{ dic }}</p>
    <p>字典取值:{{ dic.age }}</p>
    <p>字典取值:{{ dic.t.2.1 }}</p>
    
    <p>对象:{{ lqz }}</p>
    <p>对象取值:{{ lqz.name }}</p>
    
    执行方法,不要加括号,
    <p>对象方法:{{ lqz.test }}</p>
    <p>类方法:{{ lqz.class_test }}</p>
    注释:前端看不到,django给处理了
    {#<p>类方法:{{ Person}}</p>#}
    <p>列表对象{{ ll2 }}</p>
    <p>列表对象取值{{ ll2.1 }}</p>
    <p>列表对象取值,在取值{{ ll2.1.name }}</p>
    <p>对象字典{{ dic2 }}</p>
    <p>对象字典取值{{ dic2.egon.name }}</p>
    <p>空列表的情况{{ ll3 }}</p>
    直接替换成空
    <p>空字符串的情况{{ ss2 }}</p>
    
    <p>a标签 {{ ss3 }}</p>
    <h4>字典:{{ ss.upper }}</h4>
    <h4>字典:{{ dic.name.upper }}</h4>
    

    2.模板语法之过滤器

    模板:
    (1) date
    注:冒号后不能加空格 now是第一个参数,冒号后面是第二个参数
    <p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p>
    <p>date过滤器 {{ now|date }}</p>
    
    (2)default
    如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
    <p>default过滤器  {{ ss2|default:'字符串没有值' }}</p>
    <p>default过滤器  {{ ll3|default:'列表没有值' }}</p>
    
    (3)length 返回值的长度。它对字符串和列表都起作用
    <p>length过滤器  {{ ll2|length }}</p>
    
    (4) filesizeformat
    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
    <p>filesizeformat过滤器  {{ file|filesizeformat }}</p>
    <p>filesizeformat过滤器  {{ 1024|filesizeformat }}</p>
    
    (5)slice 切片操作(同py数据类型切片)
    <p>slice过滤器  {{ 'lqzisbig'|slice:'1:9' }}</p>
    
    (6)truncatechars 截断字符
    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
    <p>truncatechars过滤器  {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p>
    <p>truncatewords过滤器:  {{ 'lqz is big and egon is small'|truncatewords:3 }}</p>
    
    (7)safe   让django 不要转义网页,正常显示
    <p>safe过滤器:  {{ ss3|safe }}</p>
    {#可以在视图函数里处理 ss3 = mark_safe(ss3)#}
    
    (8)add  俩参数可以传字符串和数字,具体详见源码
    <p>add过滤器:  {{ 12|add:"3" }}</p>  结果:15
    <p>add过滤器:  {{ 'eee'|add:"3rrr" }}</p> 结果:eee3rrr
    

    3. 模板语法之标签

    3.1 for 标签

    <h1>模板语法之标签</h1>
    {#   ll = ['lqz', 18, [1, 2, [2, 3]]]#}
    {% for foo in ll %}
        <p>{{ forloop }}</p>
    {#    循环序号可以通过{{forloop}}显示 #}
    {#    {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 3, 'revcounter0': 2, 'first': True, 'last': False}#}
        <p>{{ forloop.counter }}</p> #当前循环索引从1开始计数 123
        <p>{{ forloop.counter0 }}</p> #从0开始 012
        <p>{{ forloop.revcounter }}</p>  321
        <p>{{ forloop.revcounter0 }}</p> 210
        <p>{{ forloop.first }}</p>  #判断每次循环出的数是否是第一或者最后一次
        <p>{{ forloop.last }}</p>
    {#    遍历每一个元素#}
        <p>{{ foo }}</p>
        
    {#    判断实例:#}
        {% if forloop.first %}
            lqz is big
            {% elif forloop.last %}
            两人都小
            {% else %}
            egon is small
        {% endif %}
    {% endfor %}   #必须要有结尾
    
    #parentloop用法
    {#   ll4 = [[1, 2, 3], [2, 3, 4], [1, 2, 9]]#}
    {% for foo in ll4 %}
        {% for i in foo %}
           <p>{{ forloop }}</p>
    {#        在内层循环中拿到外层循环的forloop#}
           <p>{{ forloop.parentloop }}</p>
       {% endfor %}
    {% endfor  %}
    
    # 循环出字典的值
                {% for i in dic.values %}
                    <p>{{ i }}</p>
    
                {% endfor %}
                <hr>
                {% for i in dic.keys %}
                    <p>{{ i }}</p>
    
                {% endfor %}
                <hr>
                {% for key,value in dic.items %}
                    <p>{{ key }}---->{{ value }}</p>
    
                {% endfor %}
    

    3.2 for... empty

    • 作用:for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作
    <!--视图中ll3=[]-->
    {% for foo in ll3 %}
        <p>{{ foo }}</p>
        {% empty %}  #要放在在for循环中,如果循环的对象为空,往下执行结果为'没有值'
        没有值
    {% endfor %}
    

    3.3 with

    • 作用:使用一个简单的名字缓存一个复杂的变量
    {% with tt=dic.name %}
    或者{% with dic.name as tt %}
        给取出的内容重新赋值给tt
        <p>{{ dic.name }}</p>
        <p>{{ tt }}</p>
    {% endwith %}
    

    3.4 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判断。
    

    4. 自定义过滤器和标签

    4.1 自定义过滤器

    • 步骤
    1 先去setting里面把app名字配置上
    2 再app目录下创建一个templatetags模块
    3 写py文件(my_test.py)
    4 from django import template
    5 register=template.Library()
    6 写函数 addstr(用register.filter()装饰)
    7 模板内容:
    	 {% load my_test %}
    	 {{'lqz'|addstr:'isbig' }}  #最多只能传两个参数
    
    • 代码:
    my_test文件:
    from django import template
    register=template.Library()
    @register.filter(name=tt)
    def addrstr(x,y):
        return x+y
    
    模板:
    <h1>自定义过滤器</h1>
    {% load my_test %}
    {#   过滤器可以是函数名,也可以是name指定的值 @register.filter(name=tt)#}
       {{ 'lqz'|addrstr:'isbig' }}  #lqzisbig 最多只能传两个参数
    

    4.2 自定义标签

    • 步骤:
    1 先去setting里面把app名字配置上
    2 再app目录下创建一个templatetags模块
    3 写py文件(my_test.py)
    4 from django import template
    5 register=template.Library()
    6 写函数 
    	@register.simple_tag(name='yy')
    	def my_sum(x,y,z,i):
            return x+y+z+i
    7 模板:
    	{% load my_test %}
    	{% yy 12 34 56 78 %}  #以空格做分割,传参数
    

    代码:

    my_test文件:
    from django import template
    @register.simple_tag(name='hh')
    def sun(x,y,z):
        return x+y+z
    
    模板:
    {% load my_test %}
    {% hh 5 4 7 %}   #以空格作分割,传参数
    
    • 自定义的过滤器,可以放在if判断里,
      自定义的标签,不能放在if判断里条件里

    4.2 静态文件导入

    方式一:
    <link rel="stylesheet" href="/static123/mycss.css">
    方式二:
    {% load static %}
    <link rel="stylesheet" href="{% static 'mycss.css'%}">
    方式三:
    {% load static %}
    <link rel="stylesheet" href="{% get_static_prefix %}dd/ss/mycss.css">
    

    5. 模板导入与继承

    5.1 模板导入

    1 把公共部分,放到html里,比如叫 left.html
    2 想在哪里用 导入{% include 'left.html' %}
    

    5.2 模板继承

    1  写一个母模板 base.html
    2 要更改的地方在block标签编辑
    		{% block base %}
    			母模板的盒子里也可以写东西
    		{% endblock %}
    3 在其他文件中调用母模板{%extends 'base.html' %}
    4 建盒子编辑自己的内容;
            {% block base %}
            自己的东西
            {% endblock my_head%}
    5 用母版里的内容({{block.super}} 放在那,原来母版里的东西,就会渲染在哪)
    		{% block base %}
    		{{block.super}}
    		自己的东西						
    		{% endblock my_head%}
    注:(1)如过不继承母模板盒子,它会用原来的内容;如果继承了,没写自己的东西,它会空白;写自己的内容就是什么内容,
    通过{{block.super}},可渲染出原来母模板的内容
    (2)盒子再继承时,跟顺序无关
    

    6. inclusion_tag

    • 作用:返回html代码片段
    • 步骤
    1 先去setting里面把app名字配置上
    2 再app目录下创建一个templatetags模块
    3 写py文件(my_test.py)
    4 from django import template
    5 register=template.Library()
    6 @register.inclusion_tag('test.html')
    	def my_inclusion(n):
    		data=[]
    		for i in range(n):
    			data.append('第%s行'%i)
    		return {'data':data}
    7 写test.html页面
    		<ul>
    		  {% for choice in data %}
    			<li>{{ choice }}</li>
    		  {% endfor %}
            </ul>
    	
    8 视图函数中要渲染的页面
    {% load my_test %}
     {% my_inclusion 10 %}   #它会返回html的页面
    
  • 相关阅读:
    iOS-Block的多种使用
    iOS-验证码倒计时60秒
    iOS-AFNetworking-上传图片
    Xcode 报错信息
    iOS-定时器
    iOS-开发技巧-页面布局
    iOS-nil,Nil,NULL的区别
    iOS-Debug
    iOS-NSDate
    iOS-生命周期
  • 原文地址:https://www.cnblogs.com/quqinchao/p/11220129.html
Copyright © 2020-2023  润新知