我的博客上有8个类别。我创建的视图只会显示来自选择类别的帖子。它有效但我必须为每个类别创建新视图。如何在一个视图中包含所有类别?
我的模特:
class Category(models.Model):
name = models.CharField(max_length=100)
icon = models.ImageField(upload_to='icons',
blank=True)
class Post(models.Model):
author = models.CharField(max_length=25, blank=True, null=True)
title = models.CharField(max_length=200)
text = models.TextField()
categories = models.ManyToManyField(Category, verbose_name='Categories')
published_date = models.DateTimeField(
default=timezone.now)
这是我的观点:
def sport(request):
posts = Post.objects.filter(categories__name__exact="sport").order_by('-published_date')
return render(request, 'blog/post_list.html', {'posts': posts})
你知道,这种观点仅适用于“体育”类别,“政治”类别我还有其他观点等。
在我的模板简单循环中:
{% for post in posts %}
{{ post.title }}
{% endfor %}
在网址中
url(r'^sport$', views.sport, name='sport'),
答案 0 :(得分:0)
您需要一种更加动态的方法。不要使用/sport
的网址,而是执行类似/categories/sport
的操作,并将最后一部分作为传递到视图中的变量进行进一步处理。
urls.py
url(r'^category/(?P<category_name>.*)$', views.category, name='category'),
views.py
def category(request, category_name):
posts = Post.objects.filter(categories__name=category_name)
return render(request, 'blog/post_list.html', {'posts': posts})
这样,类别名称将传递到您的视图中,您可以使用它进行过滤,并以与以前相同的方式将结果传递给模板。或者,您可能更喜欢使用ID而不是类别名称,这是完成此类过滤的常用方法。