Django——模板&过滤器

模板,指在Django中,后端将数据发送至前端后,在前端中进行数据的提取所进行的操作。

后端数据发送

  • 将后端信息,以字典形式进行前端的发送。
  • 使用render返回html文件的同时,发送已经设置的数据。
  • 不是将所有文件都发送给html,然后再通过html进行替换,而是,在python后台将数据替换完成后,发送给html,然后html再进行显示。
#后台将数据发送给前端
def login(request):
    #从数据库获取数据信息
    all_list = models.User.objects.all()
    #返回给login.html文件
    return render(request, 'login.html',{'all_list':all_list})

前端数据获取

逻辑

  • for循环

  1. 用来进行逻辑信息的提取
  2. 可使用for等其他逻辑、判断语句
  3. 一般都会配合变量信息一起使用,先进行循环,后进行可展示信息展示。
  4. 必须要有结束语句,否则会显示错误。

使用ORM来获取数据库信息,并将信息返回给html文件中。

{% for list in all_list %}  #用于逻辑信息提取
<div>
    <span>{{list.id}}   </span>      #用于变量信息,可以使用list.kp来代替
    <span>{{list.username}}</span>   #用于变量信息
</div>
{% endfor %}  #结束语句
  • 判断

  1. 用来进行对匹配数据进行判断
  2. 判断匹配后,显示内容信息
  3. 所支持的and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
  4. 可以写在单独一个标签中,也可以写在一个语句当中
{% for list in all_list %}  
<div>
    {% if 1=1 %}
        <span>{{list.username}}</span>  
    {% endif %}
</div>
{% endfor %}  #结束语句

<div class= top {% if 1=1 %} left {% endif %}></div>  //在添加判断,符合条件后增加该属性。
    
  • csrf_token

  1. 这个标签用于跨站请求伪造保护。
  2. 写上标记以后,发送post请求,会附带一个name=csrfmiddlewaretoken,vlaue=随机数字的一个请求
{% csrf_token %}   #在页面的form表单里面写上

变量

  1. 可直接用于展示的信息。
  2. 当使用位置提取时,不支持负值。
  3. 使用字典提取时,可以使用.keys
  4. 使用class时,无法使用传参形式进行。
  5. 遇到(.)时,有一个查找顺序,1.字典 2.属性或方法3. 数字索引
  6. 如果放入一个不存在的值,将不会报错,但不会显示
{{all_list}}        #可以直接获取数据内的所有内容
{{ all_list.name }} 
#可以指定获取内容,这里的.name是替换字典all_list['name']形式获取,也可以使用gets、values、items进行提取,不需要加括号。
#可以应用class中的函数,不可使用传参。
{{ all_list.1 }}    #获取以列表、字符串、元组、形式进行位置提取all_list[1]的形式的提取。
  •  with

  1. 将所需要的内容进行赋值
  2. 只能适用于其变量内部,超出不生效
  3. 如果使用=号进行赋值,那么就要注意=号两边的空格不能有
{% with books.name as 书名 %}   =   {% with 书名=books.name %}
    {{ 书名 }}
    {{ 书名 }}
    {{ 书名 }}
    {{ 书名 }}
{% endwith %}

内置属性

在使用信息时,有内置的属性可以使用

  • xxx.pk

  1. primary key的缩写,因为提取的是整个表结构,所以可以将设置 好的主键进行提取。
<span>{{list.pk}}</span>
  • get_xxx_display

应用于选项时使用,将直接显示对应的value值。

sex_type =(('male','男'),('female','女'))
sex = models.CharField('性别',choices=sex_type,default='male') #将多个选项单独创建,再导入类中进行选项的选择。

{% for i in all_list %}
    {{ i.get_sex_display }}   #获取对应的sex的名称,是男或女。默认是male或female
  • forloop

  1.  在for循环中使用
  2. 进行计数使用
  3. 可用来替换id的编写
<span>{{forloop}}   </span>   
  • forloop.counter

  1. 用于计数,每循环一次,将数值增加1
  2. 从1开始计数
<span>{{forloop.counter}}   </span>
  • forloop.last

  1. 可用于判断语句
  2. 判断值是否为最后一个,是为True
<span>
{% for i in all %}
{% if forloop.last %}  
 1
 {% else %}
    2
 {% endif %}
{% endfor %}
</span>
  • forloop.first

  1. 可用于判断语句
  2. 判断值是否为第一个,是为True
<span>
{% for i in all %}
{% if forloop.first %}  
 1
 {% else %}
    2
 {% endif %}
{% endfor %}
</span>
  • forloop.parentloop

  1. 查询父循环的内容,如果有就将信息填写,如果没有就为空
  2. 双层循环时,需要用到父循环内容可使用
{% for i in boos %}
    {% for book in i %}
        <span>{{ forloop.parentloop }}</span>
    {% endfor %}
{% endfor %}
  • empty

  1. 将没有获取到数据的for循环显示该内数据
{% for i in boos %}
    {% for book in i %}
        <span>{{ forloop.parentloop }}</span>
    {% empty %}
        <span>无法提取相关数据</span>
    {% endfor %}
{% endfor %}

内置过滤器

  1. 用来显示变量的显示结果
  2. 如果有 :时,左右两边不能有空格

语法: {{ value|filter_name:参数 }}

  • default

  1. 如果无法找到相对应的value值,那么就会显示默认nothing。
  2. value值只要有值,不管是空值或者None,都会显示。
{{ value|default:"nothing"}}

或者可以通过TEMPLATES的OPTIONS增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。

  • filesizeformat

  1. 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)

  2. 只要是数值就行,会自动将其转换成文件尺寸
  3. 最大尺寸为PB,在往上就会定格在PB
  • add

  1. 将vlaue值与设置的值进行相加
{{ 2|add:"2" }}  #得出来4
{{ '2'|add:"2" }}  #得出来4
{{ '2'|add:"abc" }}  #得出来2abc
{{ [1,2,3]|add:[4,5,6] }}  #得出来1,2,3,4,5,6
  • lower

小写

{{ value|lower }}
  • upper

大写

{{ value|upper}}
  • title

标题

{{ value|title }}
  • ljust

左对齐

"{{ value|ljust:"10" }}"
  • rjust

右对齐

"{{ value|rjust:"10" }}"
  • center

居中

"{{ value|center:"15" }}"
  • length

返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

{{ value|length }}
  • slice
  1. 切片,跟列表的切片功能一样
  2. 对字符串、列表有作用
  3. 可以倒取
{{value|slice:"2:-1"}}
  • first

取第一个元素

{{ value|first }}
  • last

取最后一个元素

{{ value|last }}
  • join

使用字符串拼接列表。同python的str.join(list)。

{{ value|join:" // " }}
  • truncatechars

  1. 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
  2. 实例截取是前6个字符,后三个是。。。

参数:截断的字符数

{{ value|truncatechars:9}}
  • truncatewords

  1. 对单词进行截取,只支持英文
  2. 实例截取8个单词字段,最后留给。。。
{{ value|truncatewords:9}}
  • divisibleby

  1. 除尽,一般用于进行判断使用
{% if value|divisibleby:2%}
  • date

  1. 日期格式化
  2. 可格式化输出的字符:点击查看
  3. 也可以在settings中配置USE_L10N= False, 在下方添加DATETIME_FORMAT = 'Y-m-d H:i:s'  直接将所有的时间格式全部应用。后续直接写value即可。
{{ value|date:"Y-m-d H:i:s"}}    #显示的是年-月-日 时:分:秒
  • safe

Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,防止XSS攻击。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。

1. 直接在html文件中设置转义

比如:

value = "<a href='#'>点我</a>"

{{ value|safe}}

2. 在自定义过滤器的装饰器上进行设置转义

@register.filter(is_safe=True)
def add_xx(value,age):
    return f"{value,age}"

3. 导入mark_safe的模块进行自定义过滤器的转义

from django.utils.safestring import mark_safe
@register.filter
def add_xx(value,age):
    return mark_safe(f"{value,age}")

自定义过滤器

1. 在APP下,创建一个名为templatetags的python包

2. 在python中创建py文件,文件名自定义即可

3. 在python文件中,需要写入

from django import template

register = template.Library()

4. 写需要的函数或者类

必须要带value,将需要处理的值导入进来。

info可有可无看需求。

最多可带有两个参数。

@register.filter
def add_xx(value,age):
    return f"{value,age}"

 5. 在html中,使用自定义模板

{% load my_file %}
{{ 'zhao'|add_xx:22 }}

自定义simpletag

和自定义filter类似,只不过接收更灵活的参数。

定义注册simple tag

@register.simple_tag(name="plus")
def plus(a, b, c):
    return "{} + {} + {}".format(a, b, c)

使用自定义simple tag

{% load app01_demo %}
{# simple tag #}
{% plus "1" "2" "abc" %}
 
 

 

 

posted @   新兵蛋Z  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示