为什么Django无法根据标签显示正确的类别?

时间:2021-06-14 14:10:32

标签: python mysql django

我已经被这个问题困住了 2 天。我的产品应该显示与用户选择的标签匹配的类别。但是,每当我单击标签时,它都会显示以下错误消息: 找不到页面 (404) 未找到与查询匹配的类别 请求方式:GET 请求网址:http://127.0.0.1:8000/tag/class-1 提出者:content.views.TagDetail

TagDetail 视图:

class TagDetail(DetailView):
    model = Category
    template_name = 'content/tag_detail.html'
    context_object_name = 'categories'

    def get_queryset(self):     
        self.tag = get_object_or_404(Tag, slug=self.kwargs['slug'])     
        return Category.objects.filter(tag=self.tag).order_by('id')

    def get_context_data(self,**kwargs):        
        context = super(TagDetail, self).get_context_data(**kwargs)
        self.tag = get_object_or_404(Tag, slug=self.kwargs['slug'])
        context['tag'] = self.tag
        return context 

我的标签模型:

class Tag(models.Model):
    title = models.CharField(max_length=50)
    slug = models.SlugField(editable=False)

    def __str__(self):
        return self.title

    def save(self,*args,**kwargs):
        self.slug = slugify(self.title)
        super(Tag, self).save(*args, **kwargs)

我的类别模型:

class Category(models.Model):
    image = models.ImageField(blank=True, null=True, default='book.jpg', upload_to='media')
    title = models.CharField(max_length=150)
    slug = models.SlugField(editable=False)
    brief = models.CharField(max_length=150,default=None)
    tag = models.ManyToManyField(Tag,related_name='categories',blank=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Category, self).save(*args, **kwargs)

    def __str__(self):
        return self.title

    def category_tag(self):
        return ', '.join(str(tag) for tag in self.tag.all())

请帮帮我!

1 个答案:

答案 0 :(得分:0)

DetailView 应该处理单个对象。在这里,您希望显示与 Category 实例相关的 Tag列表。发生的事情是 DetailView 试图过滤您返回的查询集,并使用您打算为 Tag 传递的 slug,但显然没有这样的 Category 给您一个错误。您可以做的只是将其保留为 Tag 的详细视图:

class TagDetail(DetailView):
    model = Tag
    template_name = 'content/tag_detail.html'
    context_object_name = 'tag'

接下来在模板中,您可以简单地循环相关的 Category 实例,例如:

{% for category in tag.categories.all %}
    {{ category.title }}
{% endfor %}

或者您可以将 ListView 用于 Category 并覆盖其 get_queryset 以根据 Tag 进行过滤:

from django.views.generic import ListView


class CategoryListView(ListView):
    model = Category
    ordering = 'id'
    template_name = 'content/tag_detail.html'
    context_object_name = 'categories'
    
    def get_queryset(self):
        self.tag = get_object_or_404(Tag, slug=self.kwargs['slug'])
        super().get_queryset().filter(tag=self.tag)
    
    def get_context_data(self, *args, **kwargs):
        context = super.get_context_data(*args, **kwargs)
        context['tag'] = self.tag
        return context