首页 > 解决方案 > 从 Django 视图中的特定论坛类别获取线程

问题描述

这是我当前的代码。

class TopicView(ListView):
    model               = Thread
    template_name       = 'forum/topic.html'
    context_object_name = 'threads'
    paginate_by         = 5

    def get_queryset(self):
        topic = get_object_or_404(Topic, id=self.kwargs.get('pk'))
        return Thread.objects.order_by('-date_posted')

它应该只从特定的论坛主题中获取主题,但它会获取数据库中的所有主题。我尝试了一些方法来修复它,但这些修复似乎都不起作用。

编辑:模型。

class Topic(models.Model):
    title       = models.CharField(max_length=100)
    slug        = models.SlugField(default='test')
    description = models.TextField()
    icon        = models.CharField(max_length=25)

class Thread(models.Model):
    title       = models.CharField(max_length=60)
    content     = models.CharField(max_length=255)
    date_posted = models.DateTimeField(default=timezone.now)
    author      = models.ForeignKey(User, on_delete=models.CASCADE)
    topic       = models.ForeignKey(Topic, on_delete=models.CASCADE)
    pinned      = models.BooleanField(default=False)
    locked      = models.BooleanField(default=False)
    censored    = models.BooleanField(default=False)
    deleted     = models.BooleanField(default=False)
    post_ip     = models.GenericIPAddressField()

    def num_replies(self):
        return max(0, self.post_set.count() - 1)

    def last_reply(self):
        if self.post_set.count():
            return self.post_set.order_by('-created')[0]

标签: pythondjango

解决方案


您需要按给定主题进行过滤,因此:

class TopicView(ListView):
    model               = Thread
    template_name       = 'forum/topic.html'
    context_object_name = 'threads'
    paginate_by         = 5

    def get_queryset(self):
        return Thread.objects.filter(
            topic_id=self.kwargs['pk']
        ).order_by('-date_posted')

通过设置allow_emptyon True,如果没有匹配此主题,它将返回 404 (如果根本不存在Thread,这也是这种情况):Topic

class TopicView(ListView):
    model               = Thread
    template_name       = 'forum/topic.html'
    context_object_name = 'threads'
    paginate_by         = 5
    allow_empty         = True  # 404 if empty

    def get_queryset(self):
        return Thread.objects.filter(
            topic_id=self.kwargs['pk']
        ).order_by('-date_posted')

推荐阅读