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