码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-02-22 01:08:15      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:title   detail   ati   模块   request   pytho   import   link   模板文件   

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

  某个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>

效果图:

技术图片

 

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

标签:title   detail   ati   模块   request   pytho   import   link   模板文件   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!