Django3.2中使用slug配置url路由触发TypeError错误如何解决
问题原因与修复方案
核心错误1:filter方法传参格式错误
你收到的cannot unpack non-iterable Category object报错直接来自这行代码:pages = Page.objects.filter(category)
Django的ORM查询filter方法要求传入关键字参数,不能直接传递模型实例,你需要明确指定匹配的外键字段名,修改为:pages = Page.objects.filter(category=category)
核心错误2:视图返回逻辑位置错误
你当前把return render语句写在了except代码块内部,只有查询分类不存在时才会返回响应,正常查询到分类数据时视图没有返回值,会触发The view didn't return an HttpResponse object错误,需要把return语句挪到try-except块外面。
修正后的完整show_category视图代码
def show_category(request, category_name_slug): context_dict = {} try: category = Category.objects.get(slug=category_name_slug) # 修正filter传参格式 pages = Page.objects.filter(category=category) context_dict['pages'] = pages context_dict['category'] = category except Category.DoesNotExist: context_dict['category'] = None context_dict['pages'] = None # 把返回逻辑移到外部,两种情况都能正常返回响应 return render(request, 'rango/category.html', context_dict)
其他适配Django3.2的优化建议
- 可以给Category模型的slug字段加上
unique=True约束,避免出现重复slug导致get方法返回多个对象报错:slug = models.SlugField(unique=True, null=True) - 如果不希望slug随分类名称修改而变动,可以在save方法中加判断,只在首次创建时生成slug:
def save(self, *args, **kwargs): if not self.id: self.slug = slugify(self.name) super(Category, self).save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者Yusuf Muhammad Zakar
相关产品推荐
相关产品推荐

