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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/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

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

categories.html

1
2
3
4
5
6
7
8
9
<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)-搜索