## 模板层 ## 内容概要 - 模板层传值 - 模板层过滤器 - 模板层标签 - 自定义过滤器,标签及inclusion_tag(了解) - 模板的继承与导入 {{}}:主要是与数据值相关 {%%}:主要与逻辑相关 django的模板语法是自己写的 跟jinja2不一样 1. 针对需要加括号调用的名字 django模板语法会自动加括号调用,我们只需要写名字就行 2. 模板语法的注释前端浏览器是无法查看的`{#注释内容#}` 3. 模板语法传值 1. 传值方式1精准传值,不浪费资源怎对多资源的传递书写麻烦 ```python return render(request, 'demo02.html', {'n1': name, 'a1': age}) ``` 2. 传值方式2将函数名称空间中所有的名字全部传递 名字过多并且不使用的的情况下比较浪费资源 ```python return render(request, 'demo02.html', locals()) ``` 4. 模板语法传值特性 1. 基本数据类型正常展示 2. 文件对象也可以正常展示并调用 3. 函数名会自动加括号执行将返回值展示到页面上(不支持额外传参) 4. 类名也会自动加括号调用 5. 对象则不会 6. 总结针对可以加括号调用的名字模板语法都会自动加括号调用 ```python def template_test(request): l = [11, 22, 33] d = {"name": "alex"} class Person(object): def __init__(self, name, age): self.name = name self.age = age def dream(self): return "{} is dream...".format(self.name) Alex = Person(name="Alex", age=34) jason = Person(name="jason", age=9000) Eva_J = Person(name="Eva_J", age=18) person_list = [Alex, jason, Eva_J] return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list}) ``` ```python {# 取l中的第一个参数 #} l.0 }} {# 取字典中key的值 #} {{ d.name }} {# 取对象的name属性 #} {{ person_list.0.name }} {# .操作只能调用不带参数的方法 #} {{ person_list.0.dream }} ``` ### 模板语法过滤气器(相当于内置函数) https (//www.cnblogs.com/Dominic-Ji/articles/10982302.html详细的过滤器参考这里 | 过滤器 | 用法 | 代码 | | --------------- | ---------------------------------------- | ------------------------------- | | last | 获取列表/元组的最后一个成员 | {{liast \| last) | | first | 获取列表/元组的第一个成员 | list\|first}} | | length | 获取数据的长度 | {{list \| length}} | | defualt | 当变量没有值的情况下, 系统输出默认值, | {{str\|default="默认值"}} | | safe | 让系统不要对内容中的html代码进行实体转义 | {{htmlcontent\| safe}} | | upper | 字母转换成大写 | {{str \| upper}} | | lower | 字母转换成小写 | {{str \| lower}} | | title | 每个单词首字母转换成大写 | {{str \| title}} | | date | 日期时间格式转换 | `{{ value | | cut | 从内容中截取掉同样字符的内容 | {{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` | 按单词长度截取内容 | 同上 | ## 模板层标签(模板的流程控制) if else分支 ```python {% if 1 %} if条件成立执行代码 {% else %} if条件不成执行的代码 {% endif %} ```  if elif else分支 ```python {% if 0 %} 条件1成立执行 {% elif 1 %} 条件1不成立条件2成立执行 {% else %} 条件1条件2都不成立执行 {% endif %} ```  for循环 ```python {% for foo in li %} foo }} {% endfor %} {% for foo in li %} {% if forloop.first %} # forloop.first判断是不是第一个数据 first ({{ foo) {% elif forloop.last %} # forloop.first判断是不是最后一个数据 last: foo }} {% else %} middle ({{ foo) {% endif %} ```  ```python {% for foo in li %} {{ forloop }} {% endfor %} ```  空字符串、空列表、空字典无法循环取值 ```python #views.py def index_func(request): li = [1, 2, 3, 4, 5, 6, 7, 8, 9] d1 = {} return render(request, 'index.html',locals()) # index.html {% for foo in d1 %} {% if forloop.first %} 哈哈哈 {% endif %} 坤坤坤 {% empty %} 空的值,什么都没传 {% endfor %} ```  django模板语法取值操作:只支持句点符 句点符既可以点索引也可以点键 ```python {{ d2.name }} {{ d2.age }} {{ d2.hobby.1 }} ```  复杂数据获取之后需要反复使用的可以起别名 ```python {% with d2.hobby.0 as hb %} {{ hb }} 爱好:{{ hb }} {% endwith %} ```  ## 自定义过滤器、标签及inclusion_tag(了解) 如果想要自定义一些模板语法,需要先完成下列的三个必要步骤 同一个文件内的自定义过滤器,标签,以及inclusion_tag只需要load一次,下面代码不需要再加载 ```python {% load tags %} ``` 1. 在`应用`(需要注意是应用下,不是项目根目录)下创建一个名字必须叫templatetags的目录 2. 在上述目录下创建任意名称的py文件 3. 在上述py文件内先编写两行固定代码 自定义过滤器最大只能接收两个参数 ```python from django import template register = template.Library() # 并且register这个变量名也必须一样,否则不能正常加载 @register.filter(name='mytags') def func(data, mydata): return data + mydata + 10 ``` ```python {% load tags %} li.1|mytags (li.2) ```  小案例自定义取余 ```python @register.filter(name='quyu') def qu_func(data): if data % 2 == 0: return True return False {% load tags %} {% if li.1|quyu %} 可以被2整除的 {{ li.1 }} {% else %} 不可被二整除的 {{ li.1 }} {% endif %} ```  自定义标签(参数没有限制),也需要遵守上面三个必要步骤 ```python from django import template register = template.Library() @register.simple_tag(name='mytt') def func(var1, var2, var3, var4): var4 = str(var4) return f'哈哈哈{var1, var2, var3, var4}' ``` ```python {% load tags %} {#中文必须要用字符串包裹,传递数据必须是字符型或整数,浮点型,#} {#而且参数与形参必须一致#} {% mytt '张三' 1 2.2 "['1','2','3']" %} ```  自定义inclusion_tag(局部的html代码) ```python #tags.py @register.inclusion_tag('menu.html', name='menu') def func2(n): html = [] for i in range(n): html.append(f'{i}>') return locals() ``` ```python #menu.html 哈哈哈哈哈 {% for foo in html %} {{ foo|safe }} {% endfor %} ``` ```python #index.html {% load tags %} {% menu 5 %} ```  ## 模板的继承与导入 模板的继承(重要) 多个页面有很多相似的地方 我们可以采取下列方式 方式1:传统的复制粘贴 方式2:模板的继承 1. 在模板中使用block划定子板以后可以修改 模板页 ```python 主页 登录 注册 Hello, world! ... Learn more {% block nav %} {# 这里是划定子页面可以修改的取余#} 嗨嗨嗨 老八秘制小汉堡 {% endblock %} ```  子页面继承 ```python {#继承模板页面#} {% extends 'nav.html' %} {#对模板页面允许修改的地方进行修改#} {% block nav %} name: password: {% endblock %} ```  子页面继承模板页面并,调用模板页面的可以修改内容 ```python {#继承模板页面#} {% extends 'nav.html' %} {#对模板页面允许修改的地方进行修改#} {% block nav %} {# 调用模板页面的可修改内容#} {{ block.super }} name: password: gender male female other {# 调用模板页面的可修改内容#} {{ block.super }} {% endblock %} ```  模板中至少应该三个区域 页面内容区、css样式区、js代码区 ```python {% block css %} {# 这里是划定子页面可以修改的#} #划定给css的 {% endblock %} {% block html %} {# 这里是划定子页面可以修改的#} #划定给html的 {% endblock %} {% block js %} {# 这里是划定子页面可以修改的#} #划定给js的 {% endblock %} ``` 模板的导入(了解) 将某个html的部分提前写好 之后很多html页面都想使用就可以导入 ```python 40% Complete (success) ``` ```python {% include 'temp.html' %} ```  Last modification:December 17th, 2022 at 03:46 pm © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments
Comment here is closed