Django学习之旅(十)点击不同的日期、分类和标签,跳转到对应的文章列表

参考追梦人物老师的博客记录的学习过程

本期以归档为例,实现点击不同的归档日期,调转到只包含对应日期的文章列表的首页。

模板页面

_archives.html文件下,新增a标签,标签的url对应为处理该需求的试图函数。

<div class="widget widget-archives">
  <h3 class="widget-title">归档</h3>
  <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>

href="{% url ‘blog:archives’ date.year date.month %}"通过{% url %}模板标签获得一个URL;

其中{% url %}为解析视图函数的url的模板标签。

  • 它接受多个参数,第一个为要解析的视图函数的端点值,使用 'app_name:别名’方式标识;
  • 其余参数为URL的路径参数,如日期中的year或month。
    当点击a标签后网页跳转到对应的视图函数。

定义URL规则

根据模板中的url要求,在blog/urls.py中定义URL规则。

from django.urls import path
from . import views

app_name = 'blog'  # 告诉程序,当前的url模块属于哪个应用,此次是blog应用  ---  试图函数命名空间

urlpatterns = [
    path('', views.index, name='index'),
    path('posts/<int:pk>/', views.detail, name='detail'),
    path('archives/<int:year>/<int:month>/', views.archives, name='archives'),
    path('category/<int:pk>/', views.category, name='category'),
    path('tag/<int:pk>/', views.tag, name='tag')
]

对name=‘archives’ 该URL定义了访问路径,并指定了两个int类型的参数year,month。该路径指向views.archives视图函数。

编写archives视图函数

根据逻辑要求,archives视图函数接受年月两个参数,并返回属于该日期下的所有文章,最后传递给index.html进行渲染。

blog/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})

其中 Post.objects.filter()方法接受条件参数并返回满足条件的所以对象。
注意:方法中表示属性关系使用双下线 __ 而不是点 .
如created_time__year表示created_time对象的year属性。

整体流程

最终,当我们在网页中点击归档下的某一个日期时,模板根据该日期解析得到对应的视图函数,并将year、month参数传递过去。
在这里插入图片描述
archives方法接受这两个参数,并查询满足条件的文章列表,将其传递给index.html模板。渲染后呈现出来。

对于分类和标签板块,同样的方法。
在这里插入图片描述

实现自动统计不同分类的文章数量

如上图所示,呈现出不同类别下文章的数量。
以分类为例。
blog/modess.py文件下,对Category模型在新增get_count方法,返回类别为当前类别时,文章的数量。

class Category(models.Model):
    """
    blog的分类的模型
    """
  
  ...
    def get_count(self):
        """
        返回当前分类下的文章数量
        """
        posts = Post.objects.filter(category=self)
        return len(posts)

  ...
  

于是在templates\blog\inclusions_archives.html中,可以使用category.get_count获取不同类别的文章数量。


...
    {% for category in category_list %}
      <li>
        <a href="{% url 'blog:category' category.pk  %}">
          {{category.name}}<span class="post-count">({{category.get_count}})</span></a>
      </li>
  ...
  
</div>

小结4种模型数据查询方法

  1. Post.objects.all()

查询Post模型的所有数据,返回的是一个对象列表

  1. Post.objects.dates(‘created_time’,‘month’, order=‘DESC’)

查询Post模型下的日期列表。
接受的第一个参数表示查询哪个属性的日期列表;
第二个参数表示日期列表的属性,到月为止;
第三个参数表示日期列表的排序方式,增序还是降序。

  1. post_list = Post.objects.filter( created_time__year = year, )

查询满足条件的对象列表

  1. get_object_or_404(Post, pk=pk)

查询满足条件的对象,与filter方法不同的是,只能返回满足条件的一个对象,如果有多个对象同时满足则出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值