Django 模板之自定义标签

创建 templatetags python目录

 1 from polls import views
 2 
 3 urlpatterns = [
 4     url(r'^admin/', admin.site.urls),
 5     url(r'^$', views.home),
 6     url(r'^extras2/$', views.home2),
 7     url(r'^extras3/$', views.home3),
 8     url(r'^extras4/$', views.home4),
 9     url(r'^extras5/$', views.home5),
10     url(r'^extras6/$', views.home6),
11 ]
 1 from django.shortcuts import render
 2 
 3 # Create your views here.
 4 
 5 def home(request):
 6     return render(request, 'home.html')
 7 
 8 def home2(request):
 9     return render(request, 'home2.html')
10 
11 def home3(request):
12     return render(request, 'home3.html')
13 
14 def home4(request):
15     return render(request, 'home4.html')
16 
17 def home5(request):
18     return render(request, 'home5.html')
19 
20 def home6(request):
21     return render(request, 'home6.html')
polls/views.py

 

方式1:

 1 from django import template
 2 from datetime import datetime
 3 
 4 '''
 5 当Django编译一个模板时先把原始的模板编译成一个个的节点
 6 每个节点都是Django.template.Node的一个实例
 7 节点都是有一个render函数的
 8 因此一个编译过了模板可以看成节点对象的列表
 9 自定义是必须要实现这个节点
10 '''
11 
12 #创建一个全局的register变量来注册自定义标签,它是template.Library的一个实例
13 register = template.Library()
14 
15 #定义节点类,实现render函数
16 class AllenDateNode(template.Node):
17     def __init__(self, format_string):
18         self.format_string = format_string
19 
20     def render(self, context):
21         return datetime.now().strftime(self.format_string)
22 
23 # 创建编译函数
24 def dateAllen(parse, token):
25     try:
26         tagname, format_string = token.split_contents()
27     except ValueError:
28         raise template.TemplateSyntaxError("invalid agrs")
29     return AllenDateNode(format_string[1:-1])
30 
31 register.tag(name="dateAllen", compile_function=dateAllen)
templatetags/poll_extras.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_extras %}
10 {% dateAllen "%Y-%m-%d %I:%M %p" %}
11 </body>
12 </html>
templates/home.html

 

方式2:

 1 from django import template
 2 from datetime import datetime
 3 
 4 '''
 5 当Django编译一个模板时先把原始的模板编译成一个个的节点
 6 每个节点都是Django.template.Node的一个实例
 7 节点都是有一个render函数的
 8 因此一个编译过了模板可以看成节点对象的列表
 9 自定义是必须要实现这个节点
10 '''
11 
12 #创建一个全局的register变量来注册自定义标签,它是template.Library的一个实例
13 register = template.Library()
14 
15 #定义节点类,实现render函数
16 class AllenDateNode(template.Node):
17     def __init__(self, format_string):
18         self.format_string = format_string
19 
20     def render(self, context):
21         return datetime.now().strftime(self.format_string)
22 
23 # 创建编译函数,使用装饰器实现效果
24 @register.tag()
25 def dateAllen(parse, token):
26     try:
27         tagname, format_string = token.split_contents()
28     except ValueError:
29         raise template.TemplateSyntaxError("invalid agrs")
30     return AllenDateNode(format_string[1:-1])
templatestags/poll_estras2.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_extras2 %}
10 {% dateAllen "%Y-%m-%d %I:%M %p" %}
11 </body>
12 </html>
templates/home2.html

 

方式3:

 1 from django import template
 2 from datetime import datetime
 3 
 4 '''
 5 当Django编译一个模板时先把原始的模板编译成一个个的节点
 6 每个节点都是Django.template.Node的一个实例
 7 节点都是有一个render函数的
 8 因此一个编译过了模板可以看成节点对象的列表
 9 自定义是必须要实现这个节点
10 '''
11 
12 #创建一个全局的register变量来注册自定义标签,它是template.Library的一个实例
13 register = template.Library()
14 
15 #定义节点类,实现render函数
16 class AllenDateNode(template.Node):
17     def __init__(self, format_string):
18         self.format_string = format_string
19 
20     def render(self, context):
21         now = datetime.now().strftime(self.format_string)
22         context['mytime'] = now #把格式化后的时间赋给变量并保存到context中
23         return ''
24 
25 # 创建编译函数,使用装饰器实现效果
26 @register.tag()
27 def dateAllen(parse, token):
28     try:
29         tagname, format_string = token.split_contents()
30     except ValueError:
31         raise template.TemplateSyntaxError("invalid agrs")
32     return AllenDateNode(format_string[1:-1])
templatetags/poll_extras3.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_extras3 %}
10 {% dateAllen "%Y-%m-%d %I:%M %p" %}
11 <p>现在是:{{ mytime }}</p>
12 </body>
13 </html>
templates/home3.html

 

方式4:

 1 from django import template
 2 from datetime import datetime
 3 
 4 '''
 5 当Django编译一个模板时先把原始的模板编译成一个个的节点
 6 每个节点都是Django.template.Node的一个实例
 7 节点都是有一个render函数的
 8 因此一个编译过了模板可以看成节点对象的列表
 9 自定义是必须要实现这个节点
10 '''
11 
12 #创建一个全局的register变量来注册自定义标签,它是template.Library的一个实例
13 register = template.Library()
14 
15 #定义节点类,实现render函数
16 class AllenDateNode(template.Node):
17     def __init__(self, format_string, asvar):
18         self.format_string = format_string
19         self.asvar = asvar
20 
21     def render(self, context):
22         now = datetime.now().strftime(self.format_string)
23         if self.asvar:
24             context[self.asvar] = now
25             return ''
26         else:
27             return now
28 
29 # 创建编译函数,使用装饰器实现效果
30 @register.tag()
31 def dateAllen(parse, token):
32     args = token.split_contents()
33     asvar = None
34     if len(args)==4 and args[-2] == 'as':
35         asvar = args[-1]
36     elif len(args) != 2:
37         raise template.TemplateSyntaxError('invalid args')
38     return AllenDateNode(args[1][1:-1], asvar)
templatestags/poll_estras4.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_extras4 %}
10 {% dateAllen "%Y-%m-%d %I:%M %p" as allentime %}
11 <p>现在是:{{ allentime }}</p>
12 </body>
13 </html>
templates/home4.html

 

方式5:

 1 from django import template
 2 from datetime import datetime
 3 
 4 #创建一个全局的register变量来注册自定义标签,它是template.Library的一个实例
 5 register = template.Library()
 6 
 7 # 通过使用register.assignment_tag装饰器来简化自定义标签的过程
 8 @register.assignment_tag()
 9 def get_current_time(format_string):
10     return datetime.now().strftime(format_string)
templatestags/poll_estras5.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_extras5 %}
10 {% get_current_time "%Y-%m-%d %I:%M %p" as allentime %}
11 <p>现在是:{{ allentime }}</p>
12 </body>
13 </html>
templates/home5.html

 

方式6:

 1 from django import template
 2 from polls.models import Poem
 3 
 4 #创建一个全局的register变量来注册自定义标签,它是template.Library的一个实例
 5 register = template.Library()
 6 
 7 # 通过使用register.inclusion_tag装饰器来实现导入模板标签,渲染其它模板得到的内容
 8 @register.inclusion_tag('result6.html')
 9 def poems_of_author(author_name):
10     poems = Poem.objects.filter(author=author_name)
11     return {"poems":poems, "author_name":author_name}
templatestags/poll_estras6.py
1 <ul>
2     <p>{{ author_name }}</p>
3     {% for poem in poems %}
4     <li>{{ poem.title }}</li>
5     {% endfor %}
6 </ul>
templates/result6.html
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Django进阶教程</title>
 6 </head>
 7 <body>
 8 <p>欢迎来的Django进阶课堂</p>
 9 {% load poll_extras6 %}
10 {% poems_of_author '李白' %}
11 </body>
12 </html>
templates/home6.html

 

posted @ 2017-05-21 22:36  taibai  阅读(107)  评论(0)    收藏  举报