Django问题:表单验证错误未显示,提交后直接跳转至个人页面
问题分析与解决方案
核心问题:验证错误无法显示的原因
你的CreatePost视图post方法存在逻辑漏洞:无论表单验证是否通过,最后都会强制跳转到个人页面。当标题重复时,form.is_valid()会返回False,但你没有处理这种失败场景,直接跳转导致用户看不到表单的错误提示。
修复步骤
1. 修正视图的表单处理逻辑
更新views.py中的post方法,仅在表单验证通过时跳转,失败则重新渲染表单并携带错误信息:
from django.shortcuts import render, redirect from django.urls import reverse class CreatePost(View): def get(self, request): # 规范写法:实例化表单后传递给模板 return render(request, 'create_post.html', { 'post_form': PostForm(), }) def post(self, request): # 含文件上传字段(如featured_image)必须传入request.FILES form = PostForm(request.POST, request.FILES) if form.is_valid(): post = form.save(commit=False) post.author = request.user post.slug = slugify(post.title) post.save() # 验证通过才跳转 return redirect(reverse('profile', args=[request.user])) # 验证失败时,重新渲染表单,错误信息会自动携带 return render(request, 'create_post.html', { 'post_form': form, })
2. 优化表单唯一性验证(可选)
你的Post模型中title字段已经设置了unique=True,Django的ModelForm会自动为该字段添加唯一性校验,因此你手动编写的clean_title方法属于冗余代码,可以直接删除,让框架自动处理更简洁。
如果后续需要支持文章编辑功能,保留clean_title的话需要排除当前文章本身(避免编辑时检测到自己的标题重复),但创建场景下两种方式都能正常工作。
Slug唯一性优化方案
若想彻底解决slug重复问题(比如标题大小写不同转slug后一致的情况),可以在模型的save方法中自动生成唯一slug:
from django.utils.text import slugify class Post(models.Model): # 保留原有字段... def save(self, *args, **kwargs): # 仅在新建且未设置slug时自动生成 if not self.slug and self.title: base_slug = slugify(self.title) current_slug = base_slug counter = 1 # 循环检测slug是否存在,存在则添加数字后缀 while Post.objects.filter(slug=current_slug).exists(): current_slug = f"{base_slug}-{counter}" counter += 1 self.slug = current_slug super().save(*args, **kwargs)
这样即使标题转slug后重复,也会自动生成hello-world-1、hello-world-2这类唯一slug,无需依赖标题的唯一性。
模板中显示错误信息
确保create_post.html模板能正确渲染错误提示,示例如下:
<form method="post" enctype="multipart/form-data"> {% csrf_token %} <!-- 显示表单错误 --> {% if post_form.errors %} <div style="color: red;"> {% for field in post_form %} {% for error in field.errors %} <p>{{ field.label }}: {{ error }}</p> {% endfor %} {% endfor %} </div> {% endif %} <!-- 渲染表单字段 --> {{ post_form.as_p }} <button type="submit">发布文章</button> </form>
内容的提问来源于stack exchange,提问作者JavaScriptJacksn
相关产品推荐
相关产品推荐

