自定义代码标签和布局

自定义代码标签和布局


1.代码布局:

  • 某个app特有的:
    • 自定的代码一般需放在app目录下的templatetags文件夹
    • 再到templatetags文件夹下创建python模块
  • 公用的
    • 创建一个新的app,将python模块定义到新的app中,在INSTALL_APPS注册,然后就可以使用。

2.自定义过滤器

  • 过滤器的本质:
    • 函数:一个或两个参数
      • 第一个参数:传递进来的模板变量
      • 第二个参数:普通的参数(可能默认参数,非必须)
  • 过滤器注册
    •  1 from django.template import Library
       2 
       3 register = Library()
       4 
       5 def is_male(value, regular='en'):
       6     way = {
       7         'en': ['','',],
       8         'cn': ['female','male',],
       9     }
      10     return way[regular][value]
      11 
      12 register.filter(is_male)
    • 实例注册:先实例化一个注册的对象,再调用这个对象的filter方法,filter方法传入需要注册的装饰器函数的函数名。
       1 from django.template import Library
       2 
       3 register = Library()
       4 
       5 
       6 @register.filter()
       7 def is_male(value, regular='en'):
       8     way = {
       9         'en': ['','',],
      10         'cn': ['female','male',],
      11     }
      12     return way[regular][value]
      13 
      14 # register.filter(is_male)
    • 通过实例对象的装饰器来完成对过滤器函数的调用。
  • 过滤器的使用
    • 现在html中导入过滤器模块{% load 模块 %}
    • 再像普通过滤器那样调用即可
    • 装饰器函数的第一个参数为所调用的时候传入的值。

3.自定义模板标签

  • 简单标签
  • 简单标签的定义和自定义过滤器的方式一样
 1 from django.template import Library
 2 from datetime import datetime
 3 
 4 register = Library()
 5 
 6 @register.simple_tag()
 7 def current_time(format_str):
 8     return datetime.now().strftime(format_str)
 9 
10 
11 # register.simple_tag(current_time)
  • 调用的是实例对象的simple_tag方法
  • 引用上下文参数:
    • 引用上下文的模板变量(views函数中render传递的context变量的值)
      • 在标签函数的注册方法中将take_tcontext=True。
      • 将标签函数的第一个参数设置为context
 1 from django.template import Library
 2 from datetime import datetime
 3 
 4 register = Library()
 5 
 6 @register.simple_tag(takes_context=True)
 7 def current_time(context):
 8     return datetime.now().strftime(context['format_str'])
 9 
10 
11 # register.simple_tag(current_time)

 4.包含标签(嵌套标签)

  • 为避免某一样式重复使用,django提供了包含标签
  • 首先定义样式
    1 <ul>
    2     {% for i in ls%}
    3         <li>{{ i }}</li>
    4     {% endfor %}
    5 </ul>
  • 注册样式
    1 from django.template import Library
    2 
    3 register = Library()
    4 
    5 
    6 # register.simple_tag(current_time)
    7 @register.inclusion_tag('crm/show_list_as_ul.html')
    8 def show_list_as_ul(value):
    9     return {'ls': value}

    使用实例library的实例对象的inclusion_tag方法,该方法接收一个样式的路径的字符串,最后就可以像普通标签一样是使用该样式了。

  • 接收上下文变量和上面一样,将take_context=True,函数的第一个变量设置为context即可!
原文地址:https://www.cnblogs.com/ivy-blogs/p/10655825.html