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报错。
其他隐含问题
- 未对原始标题做Slug格式转换:标题中通常包含空格、中文、特殊字符,不符合Slug字段只能包含字母、数字、连字符、下划线的要求,直接赋值会触发字段校验失败。
- 未处理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
相关产品推荐
相关产品推荐

