如何根据类别过滤帖子列表

Posted

技术标签:

【中文标题】如何根据类别过滤帖子列表【英文标题】:How to filter a list of posts based on category 【发布时间】:2020-11-14 21:51:42 【问题描述】:

嗨,我对 django 很陌生。我正在构建我的第一个网络应用程序,但遇到了一些障碍。

我有一个显示分页帖子列表的模板。我有一个侧边栏,它还动态填充帖子类别列表:

% for cat in category_count %
<div class="item d-flex justify-content-between">
<a href="#"> cat.categories__title </a>
<span> cat.categories__title__count </span>
</div>
% endfor %

我希望能够单击其中一个类别,然后按类别显示经过过滤的帖子列表。类别是帖子的多对多字段。

class Post(models.Model):
    title = models.CharField(max_length=100)
    overview = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(Author,on_delete=models.CASCADE)
    thumbnail = models.ImageField()
    categories = models.ManyToManyField(Category)
    featured = models.BooleanField()
    content = htmlField()
    previous_post = models.ForeignKey('self', related_name='previous', on_delete=models.SET_NULL, blank=True, null=True)
    next_post = models.ForeignKey('self', related_name='next', on_delete=models.SET_NULL, blank=True, null=True)

我的想法是为 'category/' 创建一个 url 并显示过滤列表,但我不知道如何设置它,以便我可以从请求中获取用户选择的类别。有什么想法吗?

注意:如果你们中的任何人都遇到过更好的方法来处理这个问题,我完全愿意接受。

提前致谢。

【问题讨论】:

【参考方案1】:

我要做的就是分两部分完成这个动作:

    显示按钮列表,用于向服务器发送有关选择的数据 将过滤后的列表(基于选择)返回到模板

第 1 步

显示项目列表,然后在name 属性中放置不同的选项供 Django 服务器读取。

<form action="" method="post">
  <input type="submit" name="choice_1" value="value1" />
  <input type="submit" name="choice_2" value="value2" />
</form>

第 2 步

您根据用户的选择返回查询集。您应该将其添加到您的视图或您认为适合处理这些数据的任何位置。

if 'choice_1' in request.POST:
    # return the queryset based on choice 1
elif 'choice_2' in request.POST:
    # return the queryset based on choice 2

Reference.

【讨论】:

【参考方案2】:

您应该使用url 模板标签以及cat.id

% for cat in category_count %
<div class="item d-flex justify-content-between">
<a href="% url 'post_view' cat.id %"> cat.categories__title </a>
<span> cat.categories__title__count </span>
</div>
% endfor %

现在在您的urls.py 中添加一个名为 post_view 的视图:

urlpatterns = [
    path('post', post_view, name='post_view'),
    ...
]

最后,在您的views.py 中,您可以将category_id 作为函数参数访问:

def post_view(request, category_id):
    posts = Post.objects.filter(categories__id=category_id)

    ...

【讨论】:

您的意思是输入“% url 'post_view' cat.id %,还是将 url/route 称为“category_view”? @Stephen 抱歉,这是一个错字。它应该是post_view

以上是关于如何根据类别过滤帖子列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 按类别过滤帖子

如何使用多个类别过滤帖子?

如何在laravel中按类别过滤帖子?

如何根据第一个下拉列表的选择过滤第二个下拉列表? - 角

如何获取在 Wordpress 中按类别过滤的自定义帖子类型的永久链接?

Wordpress - 与帖子相关的类别列表