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')
方式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)
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>
方式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])
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>
方式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])
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>
方式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)
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>
方式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)
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>
方式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}
1 <ul> 2 <p>{{ author_name }}</p> 3 {% for poem in poems %} 4 <li>{{ poem.title }}</li> 5 {% endfor %} 6 </ul>
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>

浙公网安备 33010602011771号