过滤器查漏补缺

自定义和默认标签存在的意义:  为何不在视图中直接求出来在渲染模板

避免代码重复 , 定义共同方法, 自定义过滤器后 , 方便其他视图函数直接使用 , 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 渲染后的结果在上述页面中显示 

 

posted @ 2018-11-14 23:14  heshun  阅读(165)  评论(0编辑  收藏  举报