因为这些模块都是动态变化的,使用Django的自定义模板标签实现页面侧边栏。
在app下新建一个templatetags目录(目录里必须要有__init__.py文件),新建一个py文件(blog_tags.py)用来写自定义的标签,定义一套标签,只要在前端调用这些标签就可以实现相应的功能。
最新文章:
在blog_tags.py文件中的开头要写:
from django import template
register = template.library()
在想要变成自定义标签(tag)的函数上面加上@register.simple_tag,比如:
from .models import Post
@register.simple_tag
def get_recent_posts(num=5):
return Post.objects.all().order_by('-created_time')[:num]
在前端模板中使用自定义标签:
在模板中导入自定义标签文件:{% load blog_tags %}
在要显示标签的的位置:
<ul>
{% get_recent_posts as post_list %}
{% for post in post_list %}
<li>
<a href="{% url 'blog:post_detail' post.id %}">{{ post.title }}</a>
</il>
{% empty %}
暂无文章
{% endfor %}
</ul>
------------------------------------------------------------------------------------------------------------------------------------------
归档:
# 归档模板标签
@register.simple_tag
def rachives():
# 'created_time'按创建时间字段, 'month'按月归档, order='DESC'逆序
return Post.objects.dates('created_time', 'month', order='DESC')
在前端的模板中使用自定义归档标签:
<ul>
{% archives as post_dates %}
{% for date in post_dates %}
<li>
<a href="{% url 'blog:archives' date.year date.month %}">{{ date.year }}年{{ date.month}}月</a>
</il>
{% empty %}
暂无归档
{% endfor %}
</ul>
url:
url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', archives, name='archives'),
views:
# 归档
def archives(request, year, month):
post_list = Post.objects.filter(create_time__year=year, create_time__month=month ).order_by('-create_time')
return render(request, 'blog/index.html', {'post_list': post_list})
注意mysql无法使用月份过滤问题
---------------------------------------------------------------------------------------------------------------------------------------
分类:
# 分类模板标签
from .models import Category
@register.simple_tag
def get_categories():
return Category.objects.annotate(num_posts=Count('post').filter(num_posts__gt=0)
在前端模板中使用自定义分类标签:
<ul>
{% get_categores as categories %}
{% for category in categoies %}
<li>
<a href="{% url 'blog:category' category.id %}">{{ category.name}}<span class="post-count">
{{category.num_posts}}</span>
</a>
</il>
{% empty %}
暂无分类
{% endfor %}
</ul>
url:
url(r'^category/(?P<id>\d+)/$', category, name='category'),
views:
def category(request, id):
post_list = Post.objects.filter(category_id=id).order_by('-created_time')
return render (request, 'blog/index.html', {'post_list':post_list})