自定义过滤器和标签
自定义过滤器 和 标签
过程 :
1 . 在 settings 中的 INSTALLED_APPS 配置当前app,不然 Django无法找到自定义的 simple_tag.
2 . 在app中创建 templatetags 模块 (模块名只能是 templatetags)
3 . 创建任意的 .py 文件,如 : cal.py (注意: .py 文件在一个项目中不允许名字重复)
from django.utils.safestring import mark_safe from django.template import Library register =Library() #register的名字是固定的,不可改变 @register.filter #过滤器 def mul(x,y): return x*y @register.filter #标签 def tag(val): return mark_safe("<a>%s</a>"%val) @register.filter #过滤器 def lower(val): return val.lower() @register.simple_tag #标签 , def mul_tag(x,y,z): return x*y*z
4 . 在使用自定义 simple_tag 和 filter 的html 文件中导入之前创建的 cal.py
{% load cal %}
过程 : {% load cal %} 写完要重启项目,在请求的时候,Django会自动去寻找app下的 templatetags -->下的 cal.py文件,然后执行相应的函数
5 . 使用simple_tag 和 filter (如何调用)
过滤器 : {{ var|filter_name:参数}} , 参数只能是两个,一个参数是变量 val , 一个参数是后面的那个参数.
标签 : {% simple_tag 参数1 参数2...... %}
-------------------------------.html {% load xxx %} # num=12 {{ num|multi:2 }} #24 {{ num|multi:"[22,333,4444]" }} 相当于复制了,吧[22,333,4444]乘了num遍 {% multitag 2 5 6 %} 参数不限,但不能放在if for语句中 {% simple_tag_multi num 5 %}
自定义过滤器函数的参数只能是两个,可以进行逻辑判断
自定义标签无参数限制,不能进行逻辑判断
{% if i|multi:5 > 1000 %} <!-- 判断i*5>1000 --> <p>大于{{ i }}</p> {% else %} <p>大于等于{{ i }}</p> {% endif %}
1 . 自定义/默认的过滤器和标签存在的含义 : (为何不在视图函数中直接渲染到模板上?)
避免写重复代码,定义共同的方法,自定义过滤器就可以在多个视图函数中取使用,render调用.
2 . 级联删除 : 一对一 / 一对多 / 多对多
被关联表叫主表,关联表叫从表,删除主表内容,从表内容被删除:反之不可以
3. 数据约束 : db_constraint=True. 建立约束+关系
如果 db_constraint=False 就是只是单纯的建立关系.如果建立约束会使得某些想要删除的东西删除不了.但是单纯的建立联系却可以.
但是如果不写 db_constraint=False,只是建立关系之后,Django的查询接口是不能用的,写 db_constraint=False . 可以使用查询接口.