Django根据模板名称过滤查询集

时间:2019-03-17 16:45:53

标签: python html django

在我的Django应用中,我有2个模型。一种叫做发布,一种叫做类别。当用户单击类别时,我只希望该类别中的帖子出现在类别详细信息视图中。例如,如果用户单击医疗类别,我只希望显示医疗类别中的帖子。

型号:

class Category(models.Model):
    title = models.CharField(max_length=200)
    colorcode = models.CharField(max_length=20, blank=True, null=True)
    description = models.TextField()
    image = models.ImageField(blank=True, null=True)
    slug = models.SlugField(unique=True)

class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    sub_description = models.TextField(blank=True, null=True)
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True, null=True)
    image = models.ImageField(blank=True, null=True)
    live = models.BooleanField(default=False)
    slug = models.SlugField(unique=True)

观看次数:

class CategoryDetailView(DetailView):
model = Category

def get_context_data(self, **kwargs):
    context = super(CategoryDetailView, self).get_context_data(**kwargs)
    context['category_posts'] = Post.objects.filter(live=True)
    return context

模板:

{% for post in category_posts %}
    <div class="post">
        <div class="post-title">
            {{ post.title }}
        </div>
        <div class="post-author">
            {{ post.author }}
        </div>
    </div>
{% endfor %}

1 个答案:

答案 0 :(得分:2)

DetailView中,您可以通过Category访问要渲染的实际对象(在您的情况下为self.object实例)。

因此,您可以使用get_context_data方法:

context['category_posts'] = Post.objects.filter(live=True, category=self.object)

请注意,self.object可能是None,所以您可能想处理这种情况。