django 模板层

django模板层

模板语法之传值操作

模板语法

{{}}   # 主要与数据值相关
{%%}   # 主要与逻辑相关

注意:

django的模板语法是自己写的,与jinja2模块不一样。

模板语法的注释前端浏览器是无法查看的 {##}

传值操作

方法1:
return render(request, 'demo02.html', {'n1': name, 'a1': age})
这种传值方式很精准,但是数据如果过多的话书写麻烦

方法2:
return render(request,'demo02.html', locals()) 
将当前函数内的所有名字都传给页面,如果函数内部含有大量的逻辑代码名字过多 不使用的情况下比较浪费资源

模板语法的传值特性

  1. 基本数据类型都可以正常展示
  2. 文件对象也可以展示并调用文件的一些功能
  3. 函数名会自动加括号调用并将返回值展示到页面上(不支持额外传参)
  4. 类名也会自动括号调用
  5. 对象则不会加括号调用可以点他的方法
"针对可以加括号调用的名字模板语法都会自动加括号调用"

过滤器(内置函数)

{{i|add:1}}       # 给数字+1
{{s|add:' nb'}}    # 给字符拼接
{{l|length }}      # 统计字符串或列表的长度
{{s|slice:'1:4'}}   # 切割操作
{{s|truncatechars:3}} # 3个字符后... 三个点算一个字符  用在简介内
{{s|truncatewords:3}} # 按照空格来截取 第三个空格
{{time|date:'Y-m-d H:i:s'}}  # 把视图层传过来的时间(结构化) 转成格式化
{{file_size|filesizeformat }} # 单位换算
传标签默认是不识别的,需要修改safe参数 告诉他是安全的
{{ h1|safe }}
更多过滤器参考博客:
https://www.cnblogs.com/Dominic-Ji/articles/10982302.html

模板层之标签

if..elif..else

模板层也有if判断与python大体上相似

{% if 条件 %}
	<p>if 条件成立展示</p>
{% elif 条件1 %}
	<p>elif 条件成立展示</p>
{% else %}
 	<p> 上述条件不成立展示</p>
{% endif %}

​ 不同的是在模板层使用if判断需要用模板语法{% %} 来写,并且要用 endif 结尾。条件可以自己编写也可以从视图层传。

for循环

{%for i in 数据集 %}
	<p>{{ i }}</p>
{% endfor %}
它有一个自带的对象 forloop 里面有些数据 请看下图
利用forloop编写if判断
{% for foo in li %}
    {% if forloop.first %}  # 判断第一次循环
        <p>勇士,欢迎进入大草原副本(拒绝绿),您有3次机会</p>
        {% elif forloop.last %} # 判断最后一次循环 
        <p>勇士,您的机会用完了,您绿了</p>
        {% else %}  # 不是第一次和最后一次那就是中间的
        <p>这一次你也失败了</p>
    {% endif %}
    {% empty %} # 如果传的数据是空的就会展示下p
      <p> 传的数据是空的 无法循环取值</p>
{% endfor %}

image

模板层取值

d1={'name':'liaji','age':18,'hobby':['read','music',{'a1':'哥布林森林','a2':'瘟疫之源'}]}
如上所示:
我们需要取到字典中hobby内列表里的字典a1的值
django模板层索引位也支持点的方式
<p>{{d1.hobby.2.a1}}</p>
哥布林森林

并且支持其别名 # 前提是必须在with里
<p>
    {{ d1.hobby.2.a1}}
    {% with d1.hobby.2.a1 as g %}
        <p style="color: hotpink">{{ g }}</p>
    {% endwith %}
</p>

自定义过滤器

准备工作

自定义一些模板语法 需完成下列的三步操作

  1. 在应用目录下创建一个名字必须叫templatetags的目录.
  2. 在上述目录下创建任意名称的py文件
  3. 在上述py文件内先编写两行固定的代码
from django import template
register = template.Library()

开始操作

自定义过滤器

研究内置过滤器发现 他们都是一个函数并且用一个类似语法糖 装饰了
@register.filter(is_safe=False)

我们编写一个add功能
@register.filter(name='myadd')
def func1(a,b):
    return a+b

在前端使用时需要提前导入py文件
{% load my %}
<p> {{ i|myadd:41 }}</p>

自定义标签

@register.simple_tag(name='mytag')
def func2(a,b,c,d,e):
    return f'{a}{b}{c}{d}{e}'

{% load my %}
{% mytag 'h' 'e' 'l' 'l' 'o'%}

hello

自定义inclusion_tag

局部的html代码
与前两种方法不一样的是 他是先把函数的返回值传给一个页面后渲染后,然后再把页面放到调用inclusion_tag的位置。

1.需要我们提前创建好一个空的html内部清空。# menu.html
2.再去templatetags的目录下创建的py文件内编写函数
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n):  # 传一个数值过来
    html = []
    for i in range(n):  # 循环对应的数值此时
        html.append('<li>第%s个</li>'%i)  
        # 把每次循环 li标签添加到空列表里
    return locals()

menu.html文件内 # 先把函数的返回值传给一个页面后渲染后
<ul>
    {% for liStr in html %}   # 循环获取列表内的li标签
          {{ liStr|safe }}   # 展示 safe可以识别标签语法
    {% endfor %}

</ul>

前端页面(调用inclusion_tag的位置):
{% load my %}
{% mymenu 10 %}  # 穿一个数值回去

模板的继承

功能网页可以继承主站的一些样式,并可以通过   自定义一些板块与样式

方法1: 复制主站的代码
方法2: 模板的继承
   
  1. 在主站中使用block划定可以给子版修改的区域
{% block 区域名称 %} # 名称可以随便起
{% endblock %}
  1. 子板继承模板
 需要清空子文件
    {% extends '继承的html文件' %}
	{% block 区域名称 %}
	子板自己的内容
	{% endblock %}
    
# 模板中至少应该有三个区域
页面内容区、css样式区、js代码区
子板也可以继续使用模板的内容 
{{ block.super }} 在 {% block 区域名称 %} 下面填写

模板的导入

举个例子:
 如果有很多html文件都可以用到表单文件,我们可以先写一个html文件在其内部 写好form表单渲染后, 可以在别的地方直接导入这个模板 就可以使用内部的表单。

    {% include 'myform.html' %}
posted @ 2022-12-13 20:35  李阿鸡  阅读(23)  评论(0编辑  收藏  举报
Title