django 第五课自定义模板过滤器与标签

  • 代码布局:(自定义的代码放在哪里)

  某个app特有的

    app目录下,templatetags文件夹需要放 __init__.py

    在到templetags文件夹下创建python模块(py文件)

  • 定义复用

  创建要给新的app,将他们定义在新的app中,在INSTALL_APPS

  注册,然后可以应用

自定义模板过滤器

模板过滤器是什么?
  函数,一个或两个参数
    第一个参数是传递进来的模板变量
    第二个参数,普通的参数,也可以是默认也可以不要
其实就是个函数,没有什么不同
在app目录teacher下创建templatetags目录,然后在templatetags文件夹下创建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(‘male‘,to_male)

或者

 1 from django.template import Library
 2
 3 register = Library()  #第二种 装饰器注册
 4 @register.filter()
 5 def to_male(value,arg=‘zh‘):
 6     map = {
 7         ‘zh‘:(‘女‘,‘男‘),
 8         ‘en‘:(‘female‘,‘male‘)
 9     }
10     return  map[arg][value]
11
12 # register.filter(‘male‘,to_male)

在模板文件index.html中调用需要先load下

1 {% extends ‘teacher/base.html‘ %}
2 {% load static %}
3 #调用自定义过滤器
4 {% load customer_filters %}
5 {% block title %}首页面{% endblock %}

然后通过参数调用

1             {% for stu in students %}
2                 <tr {% if stu.sex == ‘女‘  %}style="color: red"{% endif %}>
3                     <td><a href="{% url ‘teacher:detail‘ stu.id %}">{{ forloop.counter }}</a></td>
4                     <td>{{ stu.name }}</td>
5                     <td>{{ stu.age }}</td>
6                     #调用自定义标签
7                     <td>{{ stu.sex | male }}</td>
8                 </tr>
9             {% endfor %}

还可以调用英文,只需改成如下样式就可以了。

{{ stu.sex | male:‘en‘}}
1             {% for stu in students %}
2                 <tr {% if stu.sex == ‘女‘  %}style="color: red"{% endif %}>
3                     <td><a href="{% url ‘teacher:detail‘ stu.id %}">{{ forloop.counter }}</a></td>
4                     <td>{{ stu.name }}</td>
5                     <td>{{ stu.age }}</td>
6                     #调用自定义标签
7                     <td>{{ stu.sex | male:‘en‘}}</td>
8                 </tr>
9             {% endfor %}

视图views.py设置如下

 1 def index(request):
 2
 3     students = [
 4         {‘id‘: 10, ‘name‘: ‘张三‘, ‘age‘: 18, ‘sex‘: 1},
 5         {‘id‘: 11, ‘name‘: ‘李四‘, ‘age‘: 19, ‘sex‘: 0},
 6         {‘id‘: 22, ‘name‘: ‘王五‘, ‘age‘: 18, ‘sex‘: 1},
 7         {‘id‘: 138, ‘name‘: ‘赵柳‘, ‘age‘: 16, ‘sex‘: 0},
 8         {‘id‘: 90, ‘name‘: ‘钱七‘, ‘age‘: 25, ‘sex‘: 1},
 9     ]
10     return render(request, ‘teacher/index.html‘, context={
11         ‘students‘: students
12     })

自定义模板标签

  简单标签

    django.template.Library.simple_tag()

    注册

      1 普通注册

          register.simple_tag(curren_time,name=‘current‘)

      2.  装饰器:

          @register.simple_tag(name=‘current‘)

  和自定义模板过滤器一样需要在templatetags文件夹下创建customer_tags.py文件,然写如下代码

  

1 from django.template import Library
2 from datetime import datetime
3 register =Library()
4 #注册第二种方法
5 @register.simple_tag(name=‘current‘)
6 def curren_time(format_str):
7     return datetime.now().strftime(format_str)
8 #注册第一种方法
9 # register.simple_tag(curren_time,name=‘current‘)

index.html导入

1 {% extends ‘teacher/base.html‘ %}
2 {% load static %}
3 {% load customer_filter %}
4 {% load customer_tags %}
5 {% block title %}首页面{% endblock %}
6 {% block link %} <link href="{% static ‘teacher/css/index.css‘ %}" rel="stylesheet">{% endblock %}
7 {% block content %}

index.html 调用

1 <div class="container">
2         <h1>当前时间:{% current ‘%Y-%m-%d %H:%M:%S‘%}</h1>
3       <div class="starter-template">

效果显示:

引用上下文变量(views中render传递到模板中的那个context 只需要在

simple_tag中设置take_context = True)

customer|_tags.py设置如下

1 from django.template import Library
2 from datetime import datetime
3 register =Library()
4 #注册第二种方法
5 @register.simple_tag(name=‘current‘,takes_context=True)
6 def curren_time(context):
7     return datetime.now().strftime(context[‘format_str‘])
8 #注册第一种方法
9 # register.simple_tag(curren_time,name=‘current‘)

views.py中设置

 1 def index(request):
 2
 3     students = [
 4         {‘id‘: 10, ‘name‘: ‘张三‘, ‘age‘: 18, ‘sex‘: 1},
 5         {‘id‘: 11, ‘name‘: ‘李四‘, ‘age‘: 19, ‘sex‘: 0},
 6         {‘id‘: 22, ‘name‘: ‘王五‘, ‘age‘: 18, ‘sex‘: 1},
 7         {‘id‘: 138, ‘name‘: ‘赵柳‘, ‘age‘: 16, ‘sex‘: 0},
 8         {‘id‘: 90, ‘name‘: ‘钱七‘, ‘age‘: 25, ‘sex‘: 1},
 9     ]
10     format_str = ‘%Y-%m-%d %H:%M:%S‘
11     return render(request, ‘teacher/index.html‘, context={
12         ‘students‘: students,
13         ‘format_str‘:format_str,
14     })

index.html中设置

1 <div class="container">
2         <h1>当前时间:{% current %}</h1>
3       <div class="starter-template">
4         <table class="table">
5             <thead>
6             <tr>
7                 <th>序号</th>

包含标签:

  django.template.Library.inclution

  通过渲染另外一个模板来展示数据

  定义:

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

    定义一个模板

customer_tags.py文件设置,用inclutio‘n 调用 模板文件

show_ljist_al_ul.html 文件

  

1 @register.inclusion_tag(‘teacher/show_ljist_al_ul.html‘)
2 def show_list_as_ul(value):
3     return  {‘ls‘: value}

新疆一个show_ljist_al_ul.html 文件

  

1 <ul>
2     {% for l in ls %}
3         <li>{{ l }}</li>
4     {% endfor %}
5
6 </ul>

views.py设置,设置customer_tags中的value值,将课程内容传递过去

 1 def index(request):
 2
 3     students = [
 4         {‘id‘: 10, ‘name‘: ‘张三‘, ‘age‘: 18, ‘sex‘: 1,
 5          ‘course‘:[‘python‘,‘java‘,‘hack‘,‘english‘]},
 6         {‘id‘: 11, ‘name‘: ‘李四‘, ‘age‘: 19, ‘sex‘: 0,
 7          ‘course‘:[‘python‘,‘java‘,‘hack‘,‘english‘]},
 8         {‘id‘: 22, ‘name‘: ‘王五‘, ‘age‘: 18, ‘sex‘: 1,
 9          ‘course‘:[‘python‘,‘java‘,‘hack‘,‘english‘]},
10         {‘id‘: 138, ‘name‘: ‘赵柳‘, ‘age‘: 16, ‘sex‘: 0,
11          ‘course‘:[‘python‘,‘java‘,‘hack‘,‘english‘]},
12         {‘id‘: 90, ‘name‘: ‘钱七‘, ‘age‘: 25, ‘sex‘: 1,
13          ‘course‘:[‘python‘,‘java‘,‘hack‘,‘english‘]},
14     ]
15     format_str = ‘%Y-%m-%d %H:%M:%S‘
16     return render(request, ‘teacher/index.html‘, context={
17         ‘students‘: students,
18         ‘format_str‘:format_str,
19     })

模板首页index.html调用

 1   <tbody>
 2             {% for stu in students %}
 3                 <tr {% if stu.sex == ‘女‘  %}style="color: red"{% endif %}>
 4                     <td><a href="{% url ‘teacher:detail‘ stu.id %}">{{ forloop.counter }}</a></td>
 5                     <td>{{ stu.name }}</td>
 6                     <td>{{ stu.age }}</td>
 7
 8                     <td>{{ stu.sex | male:‘en‘}}</td>
 9                     <td>{% show_list_as_ul stu.course%}</td>
10                 </tr>
11             {% endfor %}
12             </tbody>

效果图:

传递样式style:

customer_tags,设置样式参数style

1 @register.inclusion_tag(‘teacher/show_ljist_al_ul.html‘)
2 def show_list_as_ul(value,style):
3     return  {‘ls‘: value,‘style‘:style}

show_ljist_al_ul.html 文件设置具体样式

 1 {% if style == ‘button‘ %}
 2     <div class="list-group">
 3         {% for l in ls %}
 4             <button type="="button" class = "list-group-item"> {{ l }}}</button>
 5         {% endfor %}
 6     </div>
 7 {% elif style == ‘link‘ %}
 8     <div class="list-group">
 9         {% for l in ls %}
10         <a href="#" class="list-group-item">{{ l }}</a>
11         {% endfor %}
12     </div>
13 {% else %}
14        <ul class="list-group">
15         {% for l in ls %}
16         <a href="#" class="list-group-item">{{ l }}</a>
17         {% endfor %}
18     </ul>
19 {% endif %}

index.html调用

 1             {% for stu in students %}
 2                 <tr {% if stu.sex == ‘女‘  %}style="color: red"{% endif %}>
 3                     <td><a href="{% url ‘teacher:detail‘ stu.id %}">{{ forloop.counter }}</a></td>
 4                     <td>{{ stu.name }}</td>
 5                     <td>{{ stu.age }}</td>
 6
 7                     <td>{{ stu.sex | male:‘en‘}}</td>
 8                     <td>{% show_list_as_ul stu.course style=‘link‘ %}</td>
 9                 </tr>
10             {% endfor %}
11             </tbody>

效果图:

原文地址:https://www.cnblogs.com/donghao1121/p/10415964.html

时间: 2024-10-09 22:08:08

django 第五课自定义模板过滤器与标签的相关文章

Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)

阅读目录(Content) 模板语法之变量 模板之过滤器 default length filesizeformat date slice truncatechars safe 模板之标签 自定义标签和过滤器 模板继承 (extend) 模板语法之include 前言:当我们想在页面上给客户端返回一个当前时间,一些初学者可能会很自然的想到用占位符,字符串拼接来达到我们想要的效果,但是这样做会有一个问题,HTML被直接硬编码在 Python代码之中. 1 2 3 4 def current_dat

Django 第三课 【模板】

## 模板 在之前的章节中 ,视图函数只返回文本,而实际上生产环境中其实很少这样用,因为实际的页面大多数是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面.目前市面上有非常多的模板系统.其中最知名最好用的就是DTL 和Jinja2.DTL 是Django Temlate Language 三个单词的缩写.也就是Django自带的模板语言.当然也可以配置Django支持Jinja2等其他模板引擎,但是作为Django内置的模板语言,和Django可以达到无缝衔接而不会产生一些不兼容的情况

django 自定义模板过滤器

参考:http://www.cnblogs.com/qwj-sysu/p/4246605.html 做的页面,一个tr里有两个td, 1.3.5等奇数数据要放在第一个td, 2.4.6等偶数数据要放在第二个td, (如果已经没有数据,td 内容要为空), 所以要根据取余数的结果来判断; 但django的模板没有取余操作,只好自定义一个 django的模板配置在:setting.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.djan

DJANGO之自定义模板过滤器

我查找了DJANGO模板的过滤器,好像指定字符串包含指定关-键字符的过滤器没有呢, 没有硬着头-皮,按网上其它人的作法,写了一个,成功了...:) 参考URL: http://liuzhijun.iteye.com/blog/1884630 http://www.xxx.com/html/2013/pythonweb_1017/588.html templatetags目录下的deploy_filter.py文件如下: #!/usr/bin/env python # coding:utf-8 f

Django(五)在模板中使用静态文件

location 最后一个文件夹名就是project名,我用了Django_Plan. Application 是自动加入的APP名字,我用了Plan 静态文件相关配置: Django_Plan\settings.py STATIC_URL = '/static/'#URL访问路径 STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"),#URL对应的路径和URL名称设一致,编写相关代码时提示是正确的 ) 示例一个图片(1.png)

Django 第六课 【模板继承】

在前端页面开发中,有些代码是需要重复使用的.这种情况可以使用 'include' 标签来实现.也可以使用另外一个比较强大的方式来实现,那就是模板继承.模板继承类似于 'python' 中的类,在父类中可以先定义好一些变量和方法,然后在子类中实现,模板继承也可以在父模板中先定义好一些子模板需要用到的代码.然后子模板直接继承就可以了,并且因为子模板肯定有自己不同的代码,因此可以在父模板中定义一个block接口,然后在子模板再去实现,以下是父模板的代码: {% load static %} <! DO

Django之模板层-自定义过滤器以及标签

自定义标签与过滤器 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 在app中创建templatetags模块(模块名只能是templatetags) 创建任意 .py 文件,如:my_tags.py from django import template # 该对象名必须是register register = template.Library() #自定义过滤器装饰器 @register.filter def mult

Django 自定义模板标签和过滤器

1.创建一个模板库 使用模板过滤器的时候,直接把过滤器写在app里,例如:在app里新建一个templatetags的文件夹,这个目录应当和 models.py . views.py 等处于同一层次.例如: books/     __init__.py     models.py     templatetags/     views.py 在 templatetags 中创建两个空文件:一个 __init__.py (告诉Python这是一个包含了Python代码的包)和一个用来存放你自定义的

django “如何”系列4:如何编写自定义模板标签和过滤器

django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足你的要求,如果觉得需更精准的模板标签或者过滤器,你可以自己编写模板标签和过滤器,然后使用{% load %}标签使用他们. 代码布局 自定义标签和过滤器必须依赖于一个django app,也就是说,自定义标签和过滤器是绑定app的.该app应该包含一个templatetags目录,这个目录一个和model.py,views.py在同一个层级,记得在该目录下建立一个__init__.py文件一遍django知道这是一个pyth