您的位置:首页 > 编程语言 > Go语言

Django学习笔记三:页面侧边栏最新文章,文章归档,分类,标签云的实现

2017-07-26 10:37 706 查看

前言

学习教程链接:http://zmrenwu.com/category/django-blog-tutorial/

此文章记录我学习中的学到的知识和理解。

运行效果



(箭头 == 点击)

根据效果图可以知道我们要实现的功能:将内容填充到各个侧边栏对应的内容下面,并实现对应的跳转功能。

下面我们一项一项的实现下列的功能:

首先在blog应用下创建一个templatetags文件夹,文件夹下面建立一个init.py,声明文件夹为python包,同时建立blog_tags.py文件夹,存放自定义的模板标签。

最新文章

思路:首先要获取数据库中的前三篇文章,然后在模板index.html和detail.html中调用显示。现在我们要解两个问题。获取和调用显示。

获取

使用Article.objects.all()从数据库获取全部数据获得一个列表,在使用切片提取前三篇文章。

templatetags/blog_tags.py
def get_recent_article(num=3):
return Article.objects.all().order_by('-created_time')[:num]


调用显示在模板

使用Django内置的模板标签:我们写入 {% get_recent_article as recent_post_list %}将从函数中获取的文章列表保存通过as保存在recent_post_list模板变量中,最后调用{% for %}{% endfor %}模板标签循环变量。

为了调用获取函数,先注册函数为模板标签:

templatetags/blog_tags.py

from django import template #导入template模块
register = template.Library()
#实例化template.Library()类

@register.simple_tag
#将函数装饰为register.simple_tag
def get_recent_article(num=3):
return Article.objects.all().order_by('-created_time')[:num]


修改detail.html和index.html模板:

templates/*.detail
{% load blog_tags %}
......
<div class="widget widget-recent-posts">
<h3 class="widget-title">最新文章</h3>
{% get_recent_article 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>
......


现在打开浏览器输入本地服务器就可以看到我们的文章以及添加到最新文章下面啦,同时点击文章标题就可以查看文章的详情。

文章归档

思路和最新文章类似,只不过我们从数据库里面获取的是文章是每篇文章的时间,点击文章归档的时间跳转到某个时间下的所有文章。

获取时间部分

templatetags/blog_tags.py
@register.simple_tag
def archives():
#month是精度,精确到月
return Article.objects.dates('created_time','month',order='DESC')


获取某个时间下的所有文章

使用filter方法根据条件过滤。

blog/views.py
def archives(request, year, month):
#注意created_time__year后面是两个下划线
article_list = Article.objects.filter(created_time__year=year,created_time__month=month).order_by('-created_time')
return render(request, 'index.html', context={'article_list':article_list})


绑定视图和url

blog/urls.py
url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$',views.archives, name='archives'),


修改detail.html和index.html模板

templates/*.detail
<div class="widget widget-archives">
<h3 class="widget-title">文章归档</h3>
{% archives as date_list %}
<ul>
{% for date in date_list %}
<li>
<a href="{% url 'blog:archives' date.year date.month %}">{{ date.year }}年 {{ date.month }}月</a>
</li>
{% empty %}
暂无归档!
{% endfor %}
</ul>
</div>


分类

分类和文章归档类似。不同的一点是我们要统计分类下面的文章数量,此时可以使用django模型的annotate方法。前面我们从数据库取数据都是用的模型管理器objects实现的,比如获取全部分类是:

Category.objects.all()


获取一个名为test的分类,获取方法:

Category.objects.get(name='test')


模型管理器objects除了all,get方法之外,还有一个annotate方法,可以帮助我们实现统计分类下的文章数量的功能。

获取分类部分(包含统计数量)

templatetags/blog_tags.py
@register.simple_tag
def get_categories():
#统计数量   Category_list=Category.objects.annotate(num_article = Count('article'))
return Category_list


获取某个分类下的所有文章

使用filter方法根据条件过滤。

blog/views.py
def category(request,id):
cate = get_object_or_404(Category,id=id)
article_list = Article.objects.filter(category=cate).order_by('-created_time')

return render(request, 'index.html', context={'article_list':article_list})


绑定视图和url

blog/urls.py
url(r'^category/(?P<id>[0-9]+)/$',views.category, name='category'),,


修改detail.html和index.html模板

templates/*.detail
<div class="widget widget-category">
<h3 class="widget-title">分类</h3>
{% get_categories as category_list %}
<ul>
{% for category in category_list %}
<li>
<a href="{% url 'blog:category' category.id %}">{{ category.name }}({{ category.num_article}})</span></a>
</li>
{% empty %}
暂无归档!
{% endfor %}
</ul>
</div>


到现在页面侧边栏的三项功能啦。

标签云

标签云功能和分类思路和做法完全一样,就不详述啦。

总结

页面侧边栏的实现主要用到了Django模板标签,模板管理器object里面的get,all,和获取每个分类下面的文章从统计量annotate方法。

学到这里忽然发现我前面没用模板继承是多么麻烦。以至于每次改模板都要修改两个,强烈建议使用模板继承。

Github:https://github.com/xuna123/Django_study1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐