自定义过滤器及标签

自定义过滤器及标签

代码布局(自定义的代码,放在哪里)
1. 某个app特有的
-app 目录下,templatetags 文件夹,包(包含__init__.py文件)
-再到 templatetags 文件夹下创建python模块(py文件)
2. 定义复用
-创建一个新的app,将他们定义在新的app中,在INSTALL_APPS
注册,然后就可以应用

1.自定义模板过滤器
-模板过滤器是什么
-函数,一般情况下有一个或两个参数
– 第一个参数,是传递进来的模板变量,不一定是字符串
– 第二个参数,普通的参数,也可以是默认,也可以不要
一般情况下返回一个字符串
其实就是个函数,没有什么不同
– 定义非常简单,就是写一个函数
在项目teacher下建立数据包templatetags,再创建文件customer_filter.py

-注册
1.
通过django.template.Library 它的实例的 filter 方法
from django.template import Library

register = Library()

filter 有两个参数:
– name 过滤器的名称,是个字符串,可以不写,默认
使用方法名作为过滤器的名称
– filter_func 定义的过滤器的函数

通过自定义过滤器进行性别转换,编辑customer_filter.py

注册的第一种方法:

from django.template import Library

register = Library()

def to_male(value,arg='zh'):
map = {
'zh':('',''),
'en':('female','male')
}
return map[arg][value]

# register.filter(to_male) #不写名称,只传过滤器函数,默认会使用过滤器名称作为name
register.filter(name='to_male',filter_func=to_male) #关键字传参

2.通过装饰器,第二种注册方法

from django.template import Library

register = Library()

@register.filter(name='male') #传递装饰器名称
#@register.filter() #不传递装饰器名称,将吧函数名作为默认的name
def to_male(value,arg='zh'):
    map = {
        'zh':('',''),
        'en':('female','male')
    }
    return map[arg][value]

-模板中使用
– 先要在index.html模板中load一下,通过python模块名

{% extends 'teacher/base.html' %}
{
    % load static %}
{
    % load customer_filter %} #加载
....
{
    % block content %}
     <body>
        <table class="table">
            <tr>
                <th>序号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
            </tr>
            <tr>
                {
    % for stu in student %}
                    <tr {% if stu.sex == 0 %}style="color: red" {% endif %}>
                        <td><a href="{% url 'teacher:detail' stu.id %}">{
   { forloop.counter }}</a></td>
                        <td>{
   { stu.name }}</td>
                        <td>{
   { stu.age }}</td>
                        <td>{
   { stu.sex|male:'en' }}</td> #这里的male名称随着上面注册的结果变动
....
  </body>
{
    % endblock %}

2.自定义模板标签
– 简单标签
django.template.Library.simple_tag()
– 创建
普通的python函数,在templatetags下创建一个customer_tag.py

实例:创建一个输出当前时间的自定义时间。允许传入一个时间格式。

– 注册
1.调用函数

from django.template import Library
from datetime import datetime

register = Library()

def current_time(format_str):
return datetime.now().strftime(format_str)
#注册
register.simple_tag(current_time,name='current')
#register.simple_tag(current_time)

模板中使用:

{% load customer_tags %}

<h1>当前时间:{% current '%Y-%m-%d %H:%M:%S' %}</h1>

– 注册
2.装饰器

from django.template import Library
from datetime import datetime

register = Library()

# @register.simple_tag
@register.simple_tag(name='current')
def current_time(format_str):
return datetime.now().strftime(format_str)

– 引用上下文变量(views中render传递到模板中的那个context)
只需要在simple_tag 中,设置参数take_context=True

views.py中添加format_str的定义值

    students = [
   ...
    ]
 
    format_str = '%Y-%m-%d %H:%M:%S'
    return  render(request,'teacher/index.html',context={
        'student':students,
        'format_str':format_str
    })

修改customer_tag.py

自定义的标签函数的第一个参数一定是 context(名字不能错)

@register.simple_tag(name='current',takes_context=True)
def current_time(context):
return datetime.now().strftime(context['format_str'])

# register.simple_tag(current_time,name='current',takes_context=True)

传值以后,模板如下。不需要在前端再传参数

{% load customer_tags %}

<h1>当前时间:{% current %}</h1>

结果展示:

自定义过滤器及标签

 

– 包含标签
通过渲染另外一个模板来展示数据

-定义
定义一个函数,接收调用时传递的模板变量

定义一个模板show_list_as_ul.html

<ul>
{% for l in ls %}
<li>{ { l }}</li>
{% endfor %}
</ul>

customer_tags中添加:

@register.inclusion_tag('teacher/show_list_as_ul.html')
def show_list_as_ul(value):
    return {
   'ls':value}

views.py中添加course选项:

  students = [
        {
    'id':10,'name':'tuple','age':18,'sex':1,'course':['python','java','hack','english']},
        {
    'id':20,'name':'xinlan','age':15,'sex':0,'course':['python','java','hack','english']},
        {
    'id':30,'name':'xiaopo','age':21,'sex':0,'course':['python','java','hack','english']},
        {
    'id':40,'name':'gulu','age':19,'sex':1,'course':['python','java','hack','english']},
        {
    'id':50,'name':'shiwei','age':20,'sex':0,'course':['python','java','hack','english']},
    ]
    format_str = '%Y-%m-%d %H:%M:%S'
    return  render(request,'teacher/index.html',context={
        'student':students,
        'format_str':format_str
    })

index.html:

    <tr>
                <th>序号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>课程</th>
            </tr>
            <tr>
                {% for stu in student %}
                    <tr {% if stu.sex == 0 %}style="color: red" {% endif %}>
                        <td><a href="{% url 'teacher:detail' stu.id %}">{
   { forloop.counter }}</a></td>
                        <td>{
   { stu.name }}</td>
                        <td>{
   { stu.age }}</td>
                        <td>{
   { stu.sex|male:'en' }}</td>
                        <td>{% show_list_as_ul stu.course  %}</td>
                    </tr>
                {% endfor %}
            </tr>

展示如图所示:

自定义过滤器及标签

包含标签接收参数。

将页面展示进一步进行优化,变成表格进行展示。

重新定义模板show_list_as_ul.html

{% if style == 'button' %}
    <div class="list-group">
        {
    % for l in ls %}
         <button type="button" class="list-group-item">{
   { l }}</button>
        {
    % endfor %}
    </div>
{
    % elif style == 'link' %}
    <div class="list-group">
     {
    % for l in ls %}
      <a href="#" class="list-group-item active">
       {
    { l }}
      </a>
    {
    % endfor %}
    </div>
{
    % else %}
    <ul class="list-group">
        {
    % for l in ls %}
        <li class="list-group-item">{
   { l }}</li>
        {
    % endfor %}
    </ul>
{
    % endif %}

customer_tags中更新如下:

@register.inclusion_tag('teacher/show_list_as_ul.html')
def show_list_as_ul(value,style):
    return {
   'ls':value,'style':style}

index.html:

    <tr>
                <th>序号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>课程</th>
            </tr>
            <tr>
                {% for stu in student %}
                    <tr {% if stu.sex == 0 %}style="color: red" {% endif %}>
                        <td><a href="{% url 'teacher:detail' stu.id %}">{
   { forloop.counter }}</a></td>
                        <td>{
   { stu.name }}</td>
                        <td>{
   { stu.age }}</td>
                        <td>{
   { stu.sex|male:'en' }}</td>
                        <td>{% show_list_as_ul stu.course 'button' %}</td>  #传递位置参数
              {#<td>{% show_list_as_ul stu.course style='button' %}</td>#} #传递关键字参数

</tr> {% endfor %} </tr>

页面展示如下:

自定义过滤器及标签

转载于:https://www.cnblogs.com/taoge188/p/10597785.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101028.html原文链接:https://javaforall.net

(0)
上一篇 2021年7月3日 下午12:00
下一篇 2021年7月3日 下午1:00


相关推荐

  • python和pycharm以及anaconda的安装顺序_症证病三者之间区别

    python和pycharm以及anaconda的安装顺序_症证病三者之间区别1、致欢迎词我将详细讲述在学Python初期的各种手忙脚乱的问题的解决,通过这些步骤的操作,让你的注意力集中在Python的语法上以及后面利用Python所解决的项目问题上。而我自己作为小白,很不幸的没有错过任何的坑,都跳了进去,所以在这里写下经验贴,一方面希望能给后来的学者能够高效的避开这些坑,另一方面也算是自己的总结与警告。2、内容大纲2.1安装顺序能够使用Python的安装…

    2022年8月28日
    4
  • 编码解码乱码字符集[通俗易懂]

    编码解码乱码字符集[通俗易懂]编码EnCode:将字符转化为字节解码DeCode:将字节转化为字符乱码:打个比方—比较多人知道的联通用字符集GBK的时候出现这样的情况:��ͨ,这就是乱码常见的中文字符集有:GBK和UTF-8国际上常用的字符集:Unicode(大字典)、ANSI UTF-8,中文占三个字节,英文占一个字节(变长),还有定长占两个字节(耗费空间多)GBK,中文占两个zijie…

    2022年5月30日
    43
  • 正则表达式匹配字符串_正则不包含某个字符串

    正则表达式匹配字符串_正则不包含某个字符串正则表达式介绍简单的模式字符匹配方括号[]反斜杠\特殊字符重复的事情元字符*元字符+元字符?元字符{m,n}正则表达式(Regularexpressions也称为REs,或regexes或regexpatterns),本质上是一个微小的且高度专业化的编程语言。它被嵌入到Python中,并通过re模块提供给程序猿使用。使用正则表达式,你需要指定一些…

    2022年8月21日
    12
  • 智能风控平台核心之风控决策引擎(三)

    智能风控平台核心之风控决策引擎(三)智能风控平台核心之风控决策引擎 三 在之前的 智能风控平台核心之风控决策引擎 一 二 中分别对决策引擎的核心功能模块 以及风控策略体系搭建要点做了详细的介绍 现在主流的风控决策引擎核心功能模块如下所示 除了模型 规则 评分卡 表达式 决策流管理功能模块 还需要指标管理 接口管理 模型监控 风控报告等模块的辅助支撑 风控决策引擎才能在实际的业务中运行 下面会对指标管理模块做一个详尽解读 在介绍指标管理模块前首先要理解什么是变量 什么是指标 什么是变量 什么是指标 什么是变量 变量来源于数

    2026年3月17日
    2
  • 微信小程序显示富文本_微信小程序text标签

    微信小程序显示富文本_微信小程序text标签wxParse方法我踩雷了微信官方文档有个更为便捷的标签<rich-textnodes=”{{}}”></rich-text>

    2022年8月18日
    6
  • [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?

    [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?

    2021年7月1日
    108

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号