• Django( 学习第五部 Django之模板语法)


    目录

      模板语法 --- 传值

      摸板语法 --- 过滤器

      模板语法 --- 标签

      自定义过滤器.标签.inclusion_tag

      模板的继承 

    模板语法 --- 传值

    {{}}       变量相关

    {%%} 逻辑相关

    后端部分

    def index(request):
        n = 123      #整型
        f = 11.1      # 浮点型
        s = 'liuun'    #字符串
        b = True      #布尔型
        l = ['小红','小花','小白']    #列表
        t = (11,222,33)             #元祖
        d = {'username':'liuun','age':18}  #字典
        se ={'晶晶','小米','西瓜'}    #集合
    
        def func():
            print('我被执行l了')
            return '你的另一半在等你'
    
        class MyClass(object):
            def get_self(self):
                return 'self'
            @staticmethod
            def get_func():
                return 'func'
            @classmethod
            def get_class(cls):
                return 'cls'
        obj = MyClass()
        
        return render(request,'index.html',locads()) 

    前端部分

    <p>{{ n }}</p>
    <p>{{ f }}</p>
    <p>{{ s }}</p>
    <p>{{ b }}</p>
    <p>{{ l }}</p>
    <p>{{ d }}</p>
    <p>{{ t }}</p>
    <p>{{ se }}</p>
    <p>传递函数名时会自动加括号调用,但是模板语法不支持给函数传额外 的参数:{{ func }}</p>
    <p>传递类名的时候也会自动加括号调用(实例化){{}}</p>
    <p>内部能够自动判断出当前变量名是否可以加括号调用 如果可以自动执行 针对的是函数名和类名</p>
    <p>{{ obj }}</p>
    <p>{{ obj.get_self }}</p>
    <p>{{ obj.get_func }}</p>
    <p>{{ obj.get-class }}</p>


    #django 的取值方法只能是用句点符进行取值'.' 可以点键点索引,可以混用.

    模板语法 --- 过滤器

    # 过滤器类似于 模板语法内置的 内置方法
    # django 内置有 60 多个过滤器 
    # 锅炉器基本语法
        {{数据|过滤器:参数}}
    
    # 常见的过滤器
    <p>统计长度:{{参数|length}}</p>
    <p>默认值(第一个参数是布尔值 为 True 时展示第一个参数的值否则展示冒号后面的值):{{参数|default:'啥也不是'}}</p>
    <p>文件大小:{{参数|filesizeformat }}</p>
    <p>日期格式化:{{参数|date:'Y-m-d H:i:s'}}</p>
    <p>切片操作(支持步长):{{参数|slice:'0:4:2'}}</p>
    <p>切去字符(包含三个点):{{参数|truncatechars:9}}</p>
    <p>切取单词(不包含三个点 按照空格切):{{参数|truncatewords:9}}</p>
    <p>移除特定字符:{{参数|cut:" "}}</p>
    <p>拼接操作:{{参数|join:'$'}}</p>
    <p>拼接操作:{{参数|add:10}}</p>
    <p>拼接操作:{{参数|add:msg}}</p>
    <p>转义:{{hhh|safe}}</p>
    <p>转义:{{sss|asfe}}</p>
    <p>转义:{{res}}</p>
    <p>默认值:{{参数|default}}</p>

    模板语法 --- 标签

    # for 循环
    
    {% for foo in 参数 %}   参数后面加 reversed 反向循环
        <p>{{ foo }}<p>
      {% empty %} # 当可迭代对象为空的时候走这个方法
                 {% endfor %}

    <!-- 循环字典 -->
    {% for foo in d1 %} <!-- 只能获取键 -->
    <li>{{ foo }}</li>
    {% endfor %}

    {% for key,value in d1.items %} <!-- 获取键值对,items.keys,values都能用 -->
    <li>{{ key }} -- {{ value }}</li>
    {% endfor %}



      补存点:

    {forloop} 循环标签对象
    <ul>
    {% for foo in 参数 %}
     forloop 循环标签对象,
    通过counter属性来标记循环的次数
    <li>{{ forloop.counter }}--{{ foo }}</li>    获取循环次数从1开始
    <li>{{ forloop.counter0 }}--{{ foo }}</li>    获取循环次数从0开始
    <li>{{ forloop.revcounter }}--{{ foo }}</li>   获取反循环次数从1 开始
    <li>{{ forloop.revcounter0 }}--{{ foo }}</li>  获取反循环次数从0 开始
    <li>{{ forloop.first}}--{{ foo }}</li>      获取循环的第一项为True其余的为False
    <li>{{ forloop.last}}--{{ foo }}</li>       获取循环的最后一次为True其余的为False
    {% endfor %}
    <ul>




    # if 判断 if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断,注意条件两边都有空格。 {% if 参数 %}
    <p>你好</p> {% elif 参数%} <p>不好</p> {% else %} <p>老伙计</p> {% endif %} # for if 混用 {% for foo in 参数 %} {% if 参数.first %} <p>这是第一次</p> [% elif 参数.last %} <P>这是最后一次</p> {% else %} <p>{{ foo }}</p> {% endif %} {% empty %} <p>for循环的可迭代参数为空时触发 empty</p> {% endfor %} # 处理字典其他方法 {% for foo in 参数.keys %} 参数后面加keys方法 values方式 items 方法 <p>{{ foo }} </p> {% endfor %} {% for foo in 参数.values %] <p>{{ foo }}</p> {% endfor %} {% for foo in 参数.items %} <p>{{ foo }}</p> {% endfor %} # with 起别名 {% with 参数.索引 as bb %} <p>{{ bb }}</p> {% endwith %}

    {% with bb=参数.索引 %}  注意等号俩边不能有空格
        <p>{{ bb }}</p>
    {% endwith %}
     

    csrf_token标签

    <form action="" method="post">
    {% csrf_token %} <!-- 加上这个标签之后,post请求就能通过django的csrf认证机制,就不需要注释settings的配置了 -->
    <input type="text" name="uname">

    <input type="submit">
    </form>

    自定义过滤器.标签.inclusion_tag

    三步走

      1 在应用下创建一个名字 '必须' 为 templatetags 文件夹

      2 在该文件内'任意创建'名称的py文件 xxx.py

      3 在该py文件内'必须'先书写下面这俩句( 单词一个都不许错 )

        from django import template

        reqister = template.Library()

    #后端部分
    from django import template
    
    reqister = template.Library()
    
    #自定义过滤器(最多只能给俩个参数)
    @ register.filter(name='baby')
    def my_sum(v1,v2):
        return vi + v2
    
    #前端部分
    #自定义过滤器的使用
    # n = 13
    {% load mytag %}
    <p>{{ n|baby:12 }}</p>
    
    # 输出结果为 25




    # 自定义标签
    @register.simple_tag(name = 'plus')
    def index(a,b,c,d):
      return '%s-%s-%s-%s'%(a,b,c,d)

    @自定义标签德用法
    {% load mytag %}
    <p>{% plus 'liuun' 123 123 123%}</p>



    # 自定义inclusion_tag 制作动态组件
    '''
    内部原理
      先定义一个方法
      在页面上调用这个方法,并且可以传值
      该方法会生成一些数据然后传递给一个html页面
      之后将渲染好的结果放到调用的位置
    '''
    @register.inclusion_tag('left_menu.html')
    def left(n):
      data = ['第{}项'.format(i) for i in range(n)]
      return locals()   #将data传递给left_menu.html

    {% left 5 %}
    # 总结:当tml页面某个地方的页面需要传参数才能够渲染出来,并且在多个页面上都需要使用到该局部
    那么就考虑将该局部页面做成 inclusion_tag形式
    (bbs 会使用到)

    模板的继承

    '''
    框架不变变内容
    '''
    # 末班的继承 首先选着一个想要继承的模板页面
    {% extands '要继承的模板页面名称' $}
    
    #继承之后 子页面和模板页面一样 需要在模板页面上划分子页面可以修改的区域
    
    {% block content %}
       
       模板内容
    
    {% endblock %}
    
    #子页面就可以声明想要修改所划分的区域
    
    {% block content %}
        
        子页面内容
    {% endblock %}
    
    # 一般情况下模板页面上至少有三块可以被修改的区域
        1 css 区域
    {% block content %}
         html区域
    {% endblock %}
        2 html 区域
    {% block css %}
        css区域
    {% endblock %}
        3 js 区域
    {% block js %}
        js 区域
    {% endblock %}

    #一般情况下 模板的页面上部分的区域越多,那么该模板的扩展性越高
    #但是如荣太多, 就不如自己直接写

     模板的导入

    '''
    将页面的某一个局部当做一个模块的形式
    那个地方需要就可以直接导入使用即可
    '''
    {% include 'wasai.html' %}

    要导入的
    xx.html
    内容:
      <h1>你好</h1>

    导入到的
    {% include 'xx.html' %}

     

    好好学习,天天向上。
  • 相关阅读:
    eclipse 异常Unhandled event loop exception
    eclipse序列化生成serialVersionUID
    [转载]给10万pv的WordPress选择最便宜高可用的硬件以及WordPress高并发支持
    struts2日常
    JQuery表格展开与内容筛选
    记一次简单的清理挖矿程序过程
    【原创总结】服务为什么会报404?
    【原创总结】Tomcat进程为什么起不来?
    【原创总结】服务为什么会报500的错误?
    【原创】关于nginx.pid丢失的解决办法
  • 原文地址:https://www.cnblogs.com/f211/p/13811679.html
Copyright © 2020-2023  润新知