一、模板标签目录结构
首先在我们的 blog 应用下创建一个 templatetags 包。之后在 templatetags\ 目录下创建一个 blog_tags.py 文件,这个文件存放自定义的模板标签代码。
此时你的目录结构应该是这样的:
blog\
__init__.py
admin.py
apps.py
migrations\
__init__.py
models.py
static\
templatetags\
__init__.py
blog_tags.py
tests.py
views.py
二、编写模板标签代码
blog/templatetags/blog_tags.py
from ..models import Post
def get_recent_posts(num=5):
return Post.objects.all().order_by('-created_time')[:num]
三、注册标签
为了能够通过 {% get_recent_posts %} 的语法在模板中调用这个函数,必须按照 Django 的规定注册这个函数为模板标签,方法如下:
blog/templatetags/blog_tags.py
from django import template
from ..models import Post
register = template.Library()
@register.simple_tag
def get_recent_posts(num=5):
return Post.objects.all().order_by('-created_time')[:num]
四、使用自定义的模板标签
打开 base.html,导入 blog_tags,并使用:
templates/base.html
{% load blog_tags %}
<!DOCTYPE html>
<html>
<body>
<div class="widget widget-recent-posts">
<h3 class="widget-title">最新文章</h3>
{% get_recent_posts as recent_post_list %}
<ul>
{% for post in recent_post_list %}
<li>
<a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
</li>
{% empty %}
暂无文章!
{% endfor %}
</ul>
</div>
<body>
</html>
五、使用inclusion_tag模板标签
blog/templatetags/blog_tags.py
@register.inclusion_tag('admin/templatetags/personal_fields_settings.html', takes_context=True)
def display_fields(context):
from ralph.accounts.models import Model_Display
group = context['original']
queryset = Model_Display.objects.filter(group=group)
models = queryset.values('model').distinct().order_by('model')
choiced_fields_dict = {}
for model in models:
model_name = model['model']
fields = []
for query in queryset:
if query.model == model_name:
fields.append(query.field)
choiced_fields_dict[model_name] = fields
return {'display_fields': display_fields_dict, 'choiced_fields': choiced_fields_dict}
admin/templatetags/personal_fields_settings.html
{% load ralph_tags %}
{% for d_model, d_fields_list in display_fields.items %}
<ul ><u>{{ d_model }}</u>
{% for d_field in d_fields_list %}
{% if d_field in choiced_fields|fields_flag:d_model %}
<li> <input id="{{ d_model}}{{ d_field}}" name={{ d_model }} value={{ d_field }} type="checkbox" checked> <label for="{{ d_model}}{{ d_field}}">{{ d_field }}</label><br></li>
{% else %}
<li> <input id="{{ d_model}}{{ d_field}}" name={{ d_model }} value={{ d_field }} type="checkbox" > <label for="{{ d_model}}{{ d_field}}">{{ d_field }}</label><br></li>
{% endif %}
{% endfor %}
</ul>
{% endfor %}
templates/base.html
{% load ralph_tags%}
<!DOCTYPE html>
<html>
<body>
<div class="widget widget-recent-posts">
<h3 class="widget-title">最新文章</h3>
{% get_recent_posts as recent_post_list %}
<ul>
{% for post in recent_post_list %}
<li>
<a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
</li>
{% empty %}
暂无文章!
{% endfor %}
</ul>
<div> {{display_fields}} <div>
</div>
<body>
</html>