过滤器查漏补缺
自定义和默认标签存在的意义: 为何不在视图中直接求出来在渲染模板
避免代码重复 , 定义共同方法, 自定义过滤器后 , 方便其他视图函数直接使用 , render调用
级联删除 : 一对一 , 一对多 / 多对多
被关联的表叫主表 , 关联表叫从表 , 删除主表内容 , 从表内容也会被删除 , 反之不可以
表的数据约束 db_constraint = True 默认建立约束
将True 改成 False , 就是只建立关系不建立约束 , 因为建立约束会导致想删除某个表的字段会不让删除, 但是只建立关系不建立约束 , 可以直接删除 , 这样既能使用Django的查询接口
startapp 应用名
文件夹放置在某个app 文件夹下 , 不需要settings中设置
templates 模块 : 应用时 , 优先从全局寻找
如果 全局没有, 则按照 INSTALLED_APPS 中 app 应用的顺序 ,依次去每个app中寻找 templates , 先找到就用
templatestags 过滤器 : 应用时 , 优先去全局寻找 ,
如果全局没有,则按照 INSTALLED_APPS 中 app项目顺序 依次去每个app项目的 templatestags 文件夹寻找 ,最后找到的会覆盖之前
PS : 前提是那些模块和过滤器名字都相同 ,就按照上面的规则应用
自定义过滤器
1, 看对应的setting中的INSTALLED_APPS 中是否当前APP项目 ,
2, 加一个包 , 包的名 必须为 templetetages
3, from django . template import Librarg
register = Library() 实例化
@ register.filter @register.simple_tag( 标签过滤器)
例如 :
def func(x,y) return x*y # 此函数加上@register.filter为 自定义乘法过滤器 页面中 {% load 包下的py文件名%} {{a|func:c}} 传两个值 最多只能穿两个值 {% mul 2 4 %} 这种可以穿多个值,
以上过滤器的使用流程,即在什么时候被调用
1 , 浏览器发送请求
2 , 服务器收到请求 , 开始分发url
3 , 进入对饮的视图函数
4 , 函数render 一个页面 , 并解析页面模板中的模板语法 {{ .... }} {% .... %} {% load 文件名 %}
5 , 当发现{% load ... %} 就会去 templatetags 中寻找对应过滤器 , 并用返回值替换对应的 {% ..... %}
6 , 最终将值渲染到页面中
templatetags 的进阶 --------includetags
cal.py
register.inclusion_tag("/menu.html")
def get_menu_data():
menu_list = [1,2,3]
return {"menu_list ":menu_list }
menu.html
{% for foo in menu_list%}
<li> {{foo}} </li>
{%endfor%}
当在别的 页面中调用 {% load cal %}
{% get_menu_data %}
会直接将 menu.html 渲染后的结果在上述页面中显示