• Django框架-模板系统


    来看一段代码

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

    直接把HTML页面嵌套在视图函数里返回给浏览器并不是一个好主意;

    原因:

    1、对页面设计进行的任何改变都必须对 Python 代码进行相应的修改,牵一发而动全身;

    2、Python 代码编写和 HTML 设计是两项不同的工作,前端开发和后端开发无非 并行;

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

    模板是什么?                                

    Django自带的模板语言=  HTML代码+逻辑控制代码,注意 模板 != HTML,模块 =HTML代码+逻辑控制代码(特殊标记);

    模板作用?

    在server端 把后端的变量 嵌入到HTML中渲染后,返回给浏览器来达到前后端代码分离,页面动态显示的目的;

     

    一、Django模板语言应用:

    Django模板语言的语法主要分为2种: {{变量}}    和   {%  Tag %} ,{{变量 }}主要用于和视图变量做替换,{% tag %}主要用于做逻辑判断和实现某些功能,正因有了数据+逻辑才构成了模板语言;

    1.1、使用双大括号引用视图中的变量

    语法:{{ 变量}} ,列表取值:{{列表. 索引}}, 字典取值:{{字典.键}}

    1.2:内置变量过滤器的使用

    如果引用得视图变量,不能直接渲染使用,可以借助fifter进行数据的二次处理,就像Python中的内置函数;

    语法:{{ 变量|fifter:参数 }}

    过滤器列表:

    1. add:给变量加上相应的值、
    2. addslashes :单引号加上转义号,一般用于输出到javascript中
    3. capfirst :第一个字母大写
    4. {{ "123spam456spam789"|cut:"spam" }}查找删除指定的字符串
    5. {{ l1|slice:":2" }} 列表切边
    6. {{ t|date:'Y-m-d' }} 转换特定时间格式
    7. {{ s|default:'空空如也' }} 值不存在,使用指定值
    8. {{ info|truncatechars:18 }} 渲染指定长度的字符
    9. {{ info1|truncatewords:9 }}渲染指定长度的单词
    10. {{ a|safe }} 声明安全可以渲染

    实例

    视图

    from django.shortcuts import render
    import datetime
    def fifters(request):
        i=10
        w="A'B'C'D'E"
        f='china'
        t=datetime.datetime.now()
        s=''
        l1=[98890,765,9870,7654]
        info='嘲笑我吧你们这些毫无眼光的人,我必将引来雷霆万钧的力量,摧古拉朽得战胜一切敌人!'
        info1='You laugh at me without the vision of people, and I will lead to an irresistible force power, corruption must defeat all enemies destroy gura!'
        li=['a','b','c','d','e','f','g']
        str1='{{hello world}}'
        a='<a href="黄色网址">点击我</a>'
        fhjsaldfhjsdfhlasdfhljsdal='hellow  world'
        return render(request,'modals.html',locals())

    模板

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板渲染</title>
    </head>
    <body>
    
     <p>{{ i|add:200 }}</p>
     <p>{{ w|addslashes}}</p>
     <p>{{ f|capfirst }}</p>
    <p>{{ "123spam456spam789"|cut:"spam" }}</p>
      <p>{{ t|date:'Y-m-d'  }}</p>
      <p>{{ l1|slice:":2" }}</p>
     <p>{{ s|default:'空空如也' }}</p>
     <p>{{ info|truncatechars:18 }}</p>
      <p>{{ info1|truncatewords:9 }}</p>
      <p>
      {% csrf_token%}
      {% for foo in li %}
          <li>{{ forloop.counter0 }}----->{{ foo }}</li>
      {% empty  %}
          <li>没有符合的对象</li>
      {% endfor %}
    
     </p>
     <p>
    
      <p>{{ a|safe }}</p>
    </body>
    </html>

    2.1、内置标签(tag)的使用

    如果引用到了视图中的变量,还不足以渲染出一个完美的页面,那就要借助tag标签,做逻辑控制和功能完善了;

    语法格式: {% tags %}

    {% for %}  {% endfor %}   for循环

    {% for row in list %}
           </tr>
              <td>{{ row.id }}</td>
              <td>{{ row.name }}</td>
              <td>{{ row.title }}</td>
              <td><a href="#" onclick="show_modal(this)">添加</a></td>
              <td id="del_s"><a href="#" onclick="modal_del(this)">删除</a> </td>
              <td><a href="#"onclick="modal_edit(this)">编辑</a></td>
             </tr>
    
         {% endfor %}

    {% if %}{% endfor %} if判断

    基本语法格式如下:

    {% if condition %}
         ... display
    {% endif %}

    或者:

    {% if condition1 %}
       ... display 1
    {% elif condition2 %}
       ... display 2
    {% else %}
       ... display 3
    {% endif %}
    <select name="class_id" id="">
             {% for row in dict %}
                 {% if row.id == name1.class_id %}
                    <option selected value="{{ row.id }}">{{ row.title}}</option>
                 {%else%}
                     <option value="{{ row.id }}">{{ row.title}}</option>
                 {%endif%}
             {% endfor %}
         </select>

    {% if row.id in cids%}  in 成员关系判断

    <p>任教课程:
                <select name="class_id" multiple size="5">
                    {% for row in clas %}
                        {% if row.id in cids%}
                                <option selected value={{ row.id}}>{{ row.title}}</option>
                        {%else%}
                                 <option value={{ row.id}}>{{ row.title}}</option>
                        {% endif %}
                    {% endfor %}
                </select>
             </p>

    {% empty %}   没有渲染到数据,提示。

    {% for foo in li %}
          <li>{{ forloop.counter0 }}----->{{ foo }}</li>
      {% empty  %}
          <li>没有符合的对象</li>
      {% endfor %}

    {% verbatim %}{% endverbatim %} 禁止渲染

    视图
    str1='{{hello world}}'
    模板
      {% verbatim %}
      {{ str1 }}
      {% endverbatim %}

    {% csrf_token %}

    用于生成csrf_token的标签,用于防治跨站攻击验证(csrf)。 其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。

    {% url %}  引用路由分配系统配置的 path 别名

    <form action="{% url "bieming"%}" >
              <input type="text">
              <input type="submit"value="提交">
              {%csrf_token%}
    </form>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p>{{args}}</p>
    <p>{% url "zhangge" i i1%}</p>
    </body>
    </html>

     

    二、自定义fifter和simp-tag

    模板语言自带的tag和过滤器,在某些情况下还不能满足我的功能需求,例如无法实现递归显示需求等,可以自定义fifter和tag;就像Python内置函数和自定义函数关系;

    1、在app中创建 templatetags目录或Python包(必须名为 templatetags

    2、templatetags文件夹下随便创建个Python文件,自定义函数;

    from django import template
    register =template.Library()
    #模板过滤器{{变量|myupper}},最少带一个参数,最多带两个,
    @register.filter()
    def myupper(myname,pstr):
        return myname.upper()+pstr
    #自定义的函数.参数没有限制,模板已空格的形式表示一个参数
    @register.simple_tag()
    def myfun(nid,sid,pid):
        return nid+sid+pid

    3、注册到setings.py文件里

    4、加载到模板里

    {% load fun %}
    <!doctype html>
    <html>
    <head>

     5、引用到模板

    {{myname|myupper:'abc'}}

    {% myfun 'abc' '321' '456' %}

    6、自定义fifter和simp-tag 区别

    1、simple-fifter

    优点:支持iif else 条件判断

     {% if  i|mutil:20 > 100 %}
         <p>大于</p>
     {% else %} }}
         <p>小于</p>
     {% endif %}

    缺点:simple-fifter类型的函数只支持2两个参数

    2、simple-tag

    优点:simple-fifter类型 无限制传参

    {% mutil2 78 90 20 %} #参数无限制

    缺点:不支持iif else 条件判断

  • 相关阅读:
    Python定时任务利器—Apscheduler
    Python命令行模块(sys.argv,argparse,click)
    Rust安装和环境配置
    DBF 文件 ORACLE 数据库恢复
    认识 Cargo-Rust构建工具和包管理器
    VS Code 搭建 Rust 开发环境
    如何按名称或PID查找一个进程?如何按端口号查找一个进程?如何查看一个进程的CPU和内存、文件句柄使用情况?如何查看CPU利用率高的TOP10进程清单?如何根据PID强制终止进程?
    String 字符串
    JVM初探之类文件结构
    隐藏Windows不常用设置项
  • 原文地址:https://www.cnblogs.com/wu-chao/p/8285336.html
Copyright © 2020-2023  润新知