You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:54:02