Skip to the content.

基于Django构建Blog(09)-Templates续


base.html模板中使用了自定义Template tag:GetCategories和GetTags,这里说一下具体实现。

按照Django的规定,自定义Template tag需要在templatetags包中实现,这个templatetags包要放在相应的App包内。对于本工程来说就是放在”apps/blog/”目录中,目录结构如下图所示:

代码在blog_extras.py文件中实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django import template
from apps.blog.models import Category, Tag

register = template.Library()
@register.inclusion_tag('categories.html', takes_context=True)
def GetCategories(context):
	categories = Category.objects.all()
	return {'categories':categories}

@register.inclusion_tag('tags.html', takes_context=True)
def GetTags(context):
	tags = Tag.objects.all().order_by('?')
	return {'tags':tags}

看上去跟View中的代码形式类似,就是多了个注册语句。这里又出现了两个模板:”categories.html”和”tags.html”,这两个模板就是用于渲染相应的categories和tags数据集的。这两个模板与前面所说的模板比起来没有什么特殊的地方,也是放在templates目录中,具体实现如下:

tags.html

{% for tag in tags %}
 <a href="{{ tag.GetAbsoluteURL }}" style="font-size: 14px;">
	{{ tag.name }}
 </a>
{% endfor %}

categories.html

<p>
 {% for category in categories %}
	<li>
	  <a href="{{ category.GetAbsoluteURL }}">
		{{ category.name }}({{ category.GetArticleNum }})
	  </a>
	</li>
 {% endfor %}
</p>



Prev-基于Django构建Blog(08)-Templates
Next-基于Django构建Blog(10)-搜索