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
相关文章推荐
- Django 博客 - 6 标签、分类和归档页面
- Django 学习小组:博客开发实战第四周——标签云与文章归档
- Django 学习小组:博客开发实战第二周教程 —— 实现博客详情页面和分类页面
- ExtJS学习笔记七:复杂页面布局实现
- jQuery学习笔记之控制页面实现代码
- PHP学习笔记(6) PHP静态化页面的实现思路
- ExtJS学习笔记八,复杂页面功能实现
- ReactOs是怎么实现系统调用的。。 老毛文章学习笔记
- android学习笔记:联系人侧边栏的实现
- 《C#入门经典》第六版 学习笔记之第十章 定义类成员(1) 10.3 接口的实现~10.5 部分类方法定义
- HTML5 之Canvas标签学习笔记一:在页面上放置canvas元素
- 学习笔记_用hibernateQBC动态查询+jsp的jstl标签库实现的动态查询以及分页特效
- 归档功能:也称作索引功能,通常都是按月份进行BLOG文件的归档(也有按分类归档的),便于大家在一个页面就查找到归档日期内的所有BLOG文章
- PHP页面静态化学习笔记之一:网址分类
- php学习笔记(三十二)ajax结合pageView类实现页面无刷新请求
- Jamendo学习笔记之七:搜索页面实现及数据加载
- asp.net实现页面的一般处理程序(CGI)学习笔记
- ExtJS学习笔记:复杂页面布局实现
- asp.net实现页面的一般处理程序(CGI)学习笔记
- jsp版本2.1 servlet版本2.5 el表达式、jstl标签学习以及自定义标签(用标签实现业务逻辑和jsp页面的分离)