如何在一个博客视图中包含所有类别

时间:2016-09-07 20:07:08

标签: django view

我的博客上有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'),

1 个答案:

答案 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而不是类别名称,这是完成此类过滤的常用方法。