IT评测·应用市场-qidao123.com

标题: Django_渲染详解 [打印本页]

作者: 南飓风    时间: 2022-9-17 08:39
标题: Django_渲染详解
Django_render

模板语法

模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了把前端代码和服务端代码分离的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。
静态网页:页面上的数据都是写死的,万年不变
动态网页:页面上的数据是从后端动态获取的(比如后端获取当前时间;后端获取数据库数据然后传递给前端页面)
Django框架中内置了web开发领域非常出名的一个DjangoTemplate模板引擎(DTL)。DTL官方文档
要在django框架中使用模板引擎把视图中的数据更好的展示给客户端,需要完成3个步骤:
配置模板目录:在当前项目根目录下创建了模板目录templates. 然后在settings.py, 模板相关配置,找到TEMPLATES配置项,填写DIRS设置模板目录。
render内部本质

  1. def index(request):
  2.         name = "hello world!"
  3.         # 1. 初始化模板,读取模板内容,实例化模板对象
  4.     # get_template会从项目配置中找到模板目录,我们需要填写的参数就是补全模板文件的路径
  5.         template = get_template("index.html")
  6.         # 2. 识别context内容, 和模板内容里面的标记[标签]替换,针对复杂的内容,进行正则的替换
  7.         context = {"name": name}
  8.         content = template.render(context, request) # render中完成了变量替换成变量值的过程,这个过程使用了正则。
  9.         print(content)
  10.         # 3. 通过response响应对象,把替换了数据的模板内容返回给客户端
  11.         return HttpResponse(content)
  12.         # 上面代码的简写,直接使用 django.shortcuts.render
  13.         # return render(request, "index.html",context={"name":name})
  14.     # return render(request,"index3.html", locals())
  15.     # data = {}
  16.     # data["name"] = "xiaoming"
  17.     # data["message"] = "你好!"
  18.     # return render(request,"index3.html", data)
复制代码
DTL模板文件是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进去,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端。
模板语法内容

1.1 深度查询
  1. def index(request):
  2.     name = "ZhangJR"
  3.     age = 22
  4.     is_married = True
  5.     course = ["global education","hongkong economy"]
  6.     regina = {
  7.         "name":"ZhangJR",
  8.         "age": 22,
  9.         "is_married": True,
  10.     }
  11.     class info():
  12.         def __init__(self,name,age):
  13.             self.name = name
  14.             self.age = age
  15.     Info = info("ZhangJR",22)
  16.     Info1 = info("ZhangJR",22)
  17.     Info2 = info("regina", 23)
  18.     Info3 = info("ivnalee", 24)
  19.     Info4 = info("qianniu", 25)
  20.     Infos = [Info1,Info2,Info3,Info4]
  21.     return render(request,"index.html",locals())
复制代码
深度查询在查询属性或者取值的过程都用.作为判断,locals函数代表将视图函数所有的内容全部传送给模板文件渲染
分别通过普通类型,字典类型,类,类的列表进行学习
  1. <h3>深度查询:句点符"."</h3>
  2. <hr>普通类型
  3. <p>姓名:{{name}}</p>
  4. <p>年龄:{{age}}</p>
  5. <p>婚否:{{is_married}}</p>
  6. <p>课程:{{course}}</p>
  7. <p>第一个课程:{{course.0}}</p>
  8. <hr>字典
  9. <p>个人信息:{{regina}}</p>
  10. <p>个人名字:{{regina.name}}</p>
  11. <p>个人年龄:{{regina.age}}</p>
  12. <hr>类对象
  13. <p>类对象名字:{{Info.name}}</p>
  14. <p>类对象年龄:{{Info.age}}</p>
  15. <hr>类列表取值
  16. <p>第二个人的姓名:{{Infos.1.name}}</p>
复制代码

1.2 内置过滤器

语法:
  1. {{obj|过滤器名称:过滤器参数}}
复制代码
内置过滤器
过滤器用法代码last获取列表/元组的最后一个成员{{list | last}}first获取列表/元组的第一个成员{{list|first}}length获取数据的长度{{list | length}}default当变量没有值的情况下, 系统输出默认值,{{str|default:"默认值"}}safe让系统不要对内容中的html代码进行实体转义{{htmlcontent| safe}}upper字母转换成大写{{str | upper}}lower字母转换成小写{{str | lower}}title每个单词首字母转换成大写{{str | title}}date日期时间格式转换`{{ valuecut从内容中截取掉同样字符的内容{{content | cut:"hello"}}list把内容转换成列表格式{{content | list}}add加法{{num| add}}filesizeformat把文件大小的数值转换成单位表示{{filesize | filesizeformat}}join按指定字符拼接内容{{list| join("-")}}random随机提取某个成员{list | random}}slice按切片提取成员{{list | slice:":-2"}}truncatechars按字符长度截取内容{{content | truncatechars:30}}truncatewords按单词长度截取内容同上
  1. Infos = [Info1.name,Info2.name,Info3.name,Info4.name]
  2. <p>信息的最后一个人的姓名:{{Infos | last}}</p>
  3. <p>信息的第一个人的姓名:{{Infos | first}}</p>
  4. <p>共有{{Infos | length}}个人</p>
复制代码

如果变成姓名 {{Name|default:"regina"}}
(default后面不能有空格)

1.3 自定义过滤器

虽然官方已经提供了许多内置的过滤器给开发者,但是很明显,还是会有存在不足的时候。例如:希望输出用户的手机号码时, 13912345678 ---->>  139*****678,这时我们就需要自定义过滤器。要声明自定义过滤器并且能在模板中正常使用,需要完成2个前置的工作:
2.1 标签
  1. {% tagname %}
复制代码
if标签
  1. is_married = True
  2. {% if is_married == True %}
  3.     <p>张女士已婚</p>
  4. {% else %}
  5.     <p>张女士未婚</p>
  6. {% endif %}
复制代码
这里需要注意的几个点:
  1.     {% if age < 20 %}
  2.         <p>太小</p>
  3.     {% elif age < 22 %}
  4.         <p>还行</p>
  5.     {% else %}
  6.         <p>正好</p>
  7.     {% endif %}
复制代码
for循环
  1. <ul>
  2.     {% for name in course %}
  3.     <li>{{ name }}</li>
  4.     {% endfor %}
  5. </ul>
复制代码
  1. <table width="800" border="1" align="center">
  2.     <tr>
  3.         <th>序号</th>
  4.         <th>姓名</th>
  5.         <th>年龄</th>
  6.     </tr>
  7. {% for info in Infos %}
  8.     <tr align="center">
  9.         <td>{{ forloop.counter }}</td>
  10.         <td>{{ info.name }}</td>
  11.         <td>{{ info.age }}</td>
  12.     </tr>
  13. {% endfor %}
  14. </table>
复制代码

还可以结合if判断
  1. {% for info in Infos %}
  2.     {% if forloop.first %}
  3.         <tr align="center" >
  4.         <td>{{ forloop.counter }}</td>
  5.         <td>{{ info.name }}</td>
  6.         <td>{{ info.age }}</td>
  7.     </tr>
  8.     {% else %}
  9.         <tr align="center">
  10.             <td>{{ forloop.counter }}</td>
  11.             <td>{{ info.name }}</td>
  12.             <td>{{ info.age }}</td>
  13.         </tr>
  14.     {% endif %}
  15. {% endfor %}
复制代码

或者还可以
  1.     {% elif info.age > 23 %}
  2.         <tr align="center" >
  3.             <td>{{ forloop.counter }}</td>
  4.             <td >{{ info.name }}</td>
  5.             <td>{{ info.age }}</td>
  6.         </tr>
复制代码

循环中, 模板引擎提供的forloop对象,用于给开发者获取循环次数或者判断循环过程的.
属性描述forloop.counter显示循环的次数,从1开始forloop.counter0显示循环的次数,从0开始forloop.revcounter0倒数显示循环的次数,从0开始forloop.revcounter倒数显示循环的次数,从1开始forloop.first判断如果本次是循环的第一次,则结果为Trueforloop.last判断如果本次是循环的最后一次,则结果为Trueforloop.parentloop在嵌套循环中,指向当前循环的上级循环3 嵌套继承

传统的模板分离技术,依靠{% include "模板文件名"%}实现,这种方式,虽然达到了页面代码复用的效果,但是由此也会带来大量的碎片化模板,导致维护模板的成本上升.因此, Django框架中除了提供这种模板分离技术以外,还并行的提供了 模板继承给开发者.
  1. {% include "模板文件名"%}  # 模板嵌入
  2. {% extends "base.html" %} # 模板继承
复制代码
3.1 include

假设现在有两个页面公用一个同样式的东西,即页面底部有一个广告~

在每一个页面里都添加一句
  1. {% include "same.html" %}
复制代码


此时两个页面就同时拥有了这一元素
3.2 extends继承

因为一个页面继承的东西可能有很多,而且有很多的固定框架,不可能每一个都用include进行继承,此时就需要extends关键字,首先我们来用bootstrap学习一下,然后在我们需要自己渲染的位置上添加区块
  1.    
  2.      {% block content %}
  3.      <p>hello world!</p>
  4.      {% endblock %}
  5.    
复制代码
其中content是自定义的名字,在模板文件里也同样要用这个名字,然后在其他文件里进行导入这个文件
  1. {% extends "same.html" %}
  2. .....
  3. {% block content %}
  4. 原来渲染的内容
  5. {% endblock %}
复制代码
被extends的文件在未使用时是这样的

我们看到有两个块是要传递给模板文件渲染的,index.html和test.html同时继承了这一文件,效果如图



在最开始的same页面中,我们是添加了一句话的,虽然这句话并不重要,但是如果我们继承的时候也想要这句话,就需要把语句改为
  1. {% block content %}
  2. {{ block.super }}
  3. ....
复制代码

此时原来same.html里面的block内容也可以得到继承

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4