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

Django CreateView中Slug字段自动填充触发WSGI错误求解

问题排查&修复方案

核心报错原因

你代码中的错误来自views层form_valid方法的这一行:

form.instance.slug = self.request.title

request是Django封装的请求对象,本身没有title属性,用户提交的标题存储在表单验证后的数据form.cleaned_data或者待保存的模型实例form.instance中,直接读取self.request.title会触发属性不存在异常,进而导致WSGI报错。

其他隐含问题

  1. 未对原始标题做Slug格式转换:标题中通常包含空格、中文、特殊字符,不符合Slug字段只能包含字母、数字、连字符、下划线的要求,直接赋值会触发字段校验失败。
  2. 未处理Slug唯一性冲突:你的模型中slug字段设置了unique=True,如果出现两篇同标题的文章,直接生成的Slug会重复,触发数据库唯一约束报错。

修复代码

首先在views文件头部导入Django自带的Slug转换工具:

from django.utils.text import slugify

然后修改CreatePost类的form_valid方法:

def form_valid(self, form):
    form.instance.author = self.request.user
    # 从表单验证后的数据中取标题,转换为slug格式
    base_slug = slugify(form.cleaned_data['title'], allow_unicode=True)
    # 处理slug唯一性,重复则追加数字后缀
    unique_slug = base_slug
    count = 1
    while Post.objects.filter(slug=unique_slug).exists():
        unique_slug = f"{base_slug}-{count}"
        count += 1
    form.instance.slug = unique_slug
    return super().form_valid(form)

注:如果需要支持中文作为Slug,调用slugify时加上allow_unicode=True参数即可。

可选优化

如果你需要在用户前端输入标题时实时预览自动生成的Slug,可以在前端模板中添加JS监听标题输入框的变化,同步将输入内容转换为Slug格式填充到Slug输入框中,后端保留上述逻辑做最终校验兜底即可。


内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:06:05