23 模板层之自定义过滤器、标签、inclusion_tag+模板的继承,导入


一、自定义过滤器、标签、inclusion_tag

做一个大致了解即可(使用频率不高)
过滤器相当于python中的内置函数 自定义过滤器相当于python中自定义函数
自定义标签也是


自定义过滤器 标签 inclusion_tag都需要三步走战略
1.在应用文件夹下创建一个名字必须叫templatetags文件夹
2.在创建的文件夹下创建一个任意名称的py文件,如:my_tags.py
3.在该py文件内先固定写两句话
     from django import template
     register = template.Library()

my_tags.py

1. 自定义过滤器(无论是内置的还是自定义都只能最多两个参数)
@register.filter(name='haha')
def aaa(a, b):
    return a + b

2. 自定义标签(自定义的标签可以定义多个参数)
@register.simple_tag(name='heihei')
def bbb(a, b, c, d):
    return '%s|%s|%s|%s' % (a, b, c, d)

3. 自定义inclusion_tag
内部原理
	先定义一个方法 
	在页面上调用该方法 并且可以传值
	该方法会生成一些数据然后传递给一个html页面
	之后将渲染好的结果放到调用的位置
@register.inclusion_tag('myul.html',name='my_ul')
def my_ul(n):
    new_list = []
    for i in range(1,n):
        new_list.append('第%s次'%i)
    return locals()

4.自定义过滤器或标签必须重新启动django方可生效

views.py

from django.shortcuts import render,HttpResponse,redirect
def index(request):
    s=111
    return render(request,"index.html",locals())

 5.自定义过滤器或标签或inclusion_tag的使用

index.html


"en">

    "UTF-8">
    Title




{% load my_tags %}


  {{ s|haha:111 }}



    {% heihei 1 2 3 4 %}


{% my_ul 10 %}

"""



6.my_url.html

    {% for foo in new_list %}
  • {{ foo }}
  • {% endfor %}

对比自定义标签与自定义过滤器

#1、自定义过滤器只能传两个参数,而自定义标签却可以传多个参数

#2、过滤器可以用于if判断,而标签不能
{% if salary|my_multi_filter:12 > 200 %}
    

优秀

{% else %}

垃圾

{% endif %}

二、模板的导入和继承

在实际开发中,模板文件彼此之间可能会有大量冗余代码,为此django提供了专门的语法来解决这个问题,主要围绕三种标签的使用:include标签、extends标签、block标签,详解如下

1.模板的导入之include标签

"""
将页面的某一个局部当成模块的形式(该模板不应该是一个完整的页面 而是一个局部页面)
哪个地方需要就可以直接导入使用即可
"""
{% include '模版名称' %}

2.模版的继承

 

"""
你们有没有见过一些网站
    这些网站页面整体都大差不差 只是某一些局部在做变化   
"""

母版:
# 继承了之后子页面跟模版页面长的是一模一样的 你需要在模版页面上提前划定可以被修改的区域 {% block 自定义名称 %} #自定义名称可以是content\title\cs\js等 母版内容 {% endblock %}

子版
# 模版的继承 你自己先选好一个你要想继承的模版页面
{% extends 'home.html' %}
# 子页面就可以声明想要修改哪块划定了的区域 
{% block 自定义名称 %}
自定义其他内容
 {{ block.super }}  # 也可以引用母版的内容 {
% endblock %} # 一般情况下母版页面上应该至少有三块可以被修改的区域 1.css区域 2.html区域 3.js区域 {% block css %} {% endblock %} {% block content %} 可以根据页面内容的布局写多个 {% endblock %} {% block js %} {% endblock %} # 每一个子页面就都可以有自己独有的css代码 html代码 js代码 """ 一般情况下 模版的页面上划定的区域越多 那么该模版的扩展性就越高 但是如果太多 那还不如自己直接写 """