创建自定义的模板标签(template tags)和过滤器(filters)
当你需要在你的模板中添加功能而Django模板标签(template tags)的核心设置无法提供此功能的时候,自定义模板标签会非常方便。
创建自定义的模板标签(template tags)
Django提供了以下帮助函数(functions)来允许你以一种简单的方式创建自己的模板标签(template tags):
simple_tag:处理数据并返回一个字符串(string)
inclusion_tag:处理数据并返回一个渲染过的模板(template)
assignment_tag:处理数据并在上下文(context)中设置一个变量(variable)
模板标签(template tags)必须存在Django的应用中。
from django import template
register = template.Library()
from ..models import Post
@register.simple_tag
def total_posts():
return Post.published.count()
在使用自定义的模板标签(template tags)之前,你必须使用{% load %}标签在模板(template)中来加载它们才能有效。
@register.inclusion_tag('blog/post/latest_posts.html')
def show_latest_posts(count=5):
latest_posts = Post.published.order_by('-publish')[:count]
return {'latest_posts': latest_posts}
我们通过装饰器@register.inclusion_tag注册模板标签(template tag),指定模板(template)必须被blog/post/latest_posts.html返回的值渲染
这个函数返回了一个字典变量而不是一个简单的值。包含标签(inclusion tags)必须返回一个字典值,作为上下文(context)来渲染特定的模板(template)。包含标签(inclusion tags)返回一个字典。
@register.assignment_tag
def get_most_commented_posts(count=5):
return Post.published.annotate(
total_comments=Count('comments')
).order_by('-total_comments')[:count]
聚合了每一个帖子的评论总数并保存在total_comments字段中
过滤器其实就是Python函数并提供了一个或两个参数————一个是需要处理的变量值,一个是可选的参数。它们返回的值可以被展示或者被别的过滤器(filters)处理。
from django.utils.safestring import mark_safe
import markdown
@register.filter(name='markdown')
def markdown_format(text):
return mark_safe(markdown.markdown(text))
作者:stayhungry_a883
链接:http://www.jianshu.com/p/7c6eeafdc633
來源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。