Django开发--step5 归档+分类+评论

版权声明:转载请标明本文来源,欢迎点赞评论一起学习ヾ(◍°∇°◍)ノ゙ https://blog.csdn.net/slyslyme/article/details/87857678

一、归档

实现点击归档时,展示在此归档下的文章列表页面

在views.py中:

def archives(request, year, month):
    post_list = Post.objects.filter(created_time__year=year,
                                    created_time__month=month
                                    ).order_by('-created_time')
    return render(request, 'blog/index.html', context={'post_list': post_list})

这里我们使用了模型管理器(objects)的 filter 函数来过滤文章。由于是按照日期归档,因此这里根据文章发表的年和月来过滤。具体来说,就是根据 created_time 的 year 和 month 属性过滤,筛选出文章发表在对应的 year 年和 month 月的文章。注意这里 created_time 是 Python 的 date 对象,其有一个 year 和 month 属性,Python 中类实例调用属性的方法通常是 created_time.year,但是由于这里作为函数的参数列表,所以 Django 要求我们把点替换成了两个下划线,即 created_time__year。同时和 index 视图中一样,我们对返回的文章列表进行了排序。此外由于归档的下的文章列表的显示和首页是一样的,因此我们直接渲染了index.html 模板。

在urls.py中加入

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

这个归档视图对应的 URL 的正则表达式和 detail 视图函数对应的 URL 是类似的,这在之前我们讲过。两个括号括起来的地方是两个命名组参数,Django 会从用户访问的 URL 中自动提取这两个参数的值,然后传递给其对应的视图函数。例如如果用户想查看 2017 年 3 月下的全部文章,他访问 /archives/2017/3/,那么 archives 视图函数的实际调用为:archives(request, year=2017, month=3)

然后在templates/base.html


{% for date in date_list %}
<li>
  <a href="{% url 'blog:archives' date.year date.month %}">
    {{ date.year }} 年 {{ date.month }} 月
  </a>
</li>
{% endfor %}

这里 {% url %} 这个模板标签的作用是解析视图函数 blog:archives 对应的 URL 模式,并把 URL 模式中的年和月替换成 date.yeardate.month 的值。例如 blog:archives 表示 blog 应用下的 archives 函数,这个函数对应的 URL 模式为 ^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$,假设 date.year=2017date.month=5,那么 {% url 'blog:archives' date.year date.month %} 模板标签返回的值为/archives/2017/5/。

为什么要使用 {% url %} 模板标签呢?事实上,我们把超链接的 href 属性设置为 /archives/{{ date.year }}/{{ date.month }}/ 同样可以达到目的,但是这种写法是硬编码的。虽然现在 blog:archives 视图函数对应的 URL 模式是这种形式,但是如果哪天这个模式改变了呢?如果使用了硬编码的写法,那你需要把每一处 /archives/{{ date.year }}/{{ date.month }}/ 修改为新的模式。但如果使用了 {% url %} 模板标签,则不用做任何修改。

测试一下,点击侧边栏归档的日期,跳转到归档页面,发现报了个错误,提示没有安装 pytz。激活虚拟环境,使用 pip install pytz 安装即可。

重启一下开发服务器,再次测试,发现可以显示归档下的文章列表了。

二、分类页面

视图函数中

def category(request, pk):
    # 记得在开始部分导入 Category 类
    cate = get_object_or_404(Category, pk=pk)
    post_list = Post.objects.filter(category=cate).order_by('-created_time')
    return render(request, 'blog/index.html', context={'post_list': post_list})

传入的 pk 值(也就是被访问的分类的 id 值)从数据库中获取到这个分类。get_object_or_404 函数和 detail 视图中一样,其作用是如果用户访问的分类不存在,则返回一个 404 错误页面以提示用户访问的资源不存在。然后我们通过 filter 函数过滤出了该分类下的全部文章。

在urls.py中

url(r'^category/(?P<pk>[0-9]+)/$', views.category, name='category'),
{% for category in category_list %}
<li>
  <a href="{% url 'blog:category' category.pk %}">{{ category.name }}</a>
</li>
{% endfor %}

三、评论

评论是一个相对独立的功能,Django提倡相对独立的功能最好是创建一个应用

python manage.py startapp comments

关于评论:

功能: 评论文章(评论回复)+显示文章评论

问题: 关于django中关于表格表单的插件 + 如何获取当前文章的pk + 数据库设计

表格表单的插件:

在详情文章中已经获取得到文章的PK

猜你喜欢

转载自blog.csdn.net/slyslyme/article/details/87857678
今日推荐