我已经被这个问题困住了 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())
请帮帮我!
答案 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