Django 2按类别显示帖子

时间:2019-02-28 19:23:07

标签: django

在我的Django 2.1应用中,我具有以下视图:

def single(request, post_slug):
    post = get_object_or_404(Post, slug=post_slug)
    suggested = Post.objects.all()[:2]
    context = {'post': post, 'suggested': suggested}
    return render(request, 'single.html', context)

def course(request,post_tags):
    posts = get_object_or_404(Post, tags=post_tags)
    posts = Post.objects.filter(is_course=True).filter(tags__contains=post_tags).order_by('lesson_order')
    return render(request, 'learn.html', {'posts': posts})

和urls.py

    path('courses/<tag:post_tags/', app.views.course, name='learn'),
    path( '<slug:post_slug>/', app.views.single, name='single')

单个帖子运行正常,但课程/标签名不会返回404,尽管我确定要加载的标签存在。

我认为我在某个地方犯了一个小错误!在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的path(..)规范存在两个错误:

  1. 您忘记关闭尖括号(>);和
  2. tag不是有效的path converter [Django-doc],我们可以使用strpath之类的另一个。

因此,我们可以修复这两个错误并获得以下path(..)

path('courses/<path:post_tags>/', app.views.course, name='learn'),

在视图本身中,您可能要使用get_object_or_404 [Django-doc],因为如果有多个具有给定标签的Post,那么它将引发一个错误。您可能要使用get_list_or_404 [Django-doc]

from django.shortcuts import get_list_or_404

def course(request,post_tags):
    posts = get_list_or_404(Post.objects.order_by('lesson_order'), is_course=True, tags__contains=post_tags)
    return render(request, 'learn.html', {'posts': posts})