Django自定义UserCreationForm提交后无法创建用户问题
Django自定义UserCreationForm注册失败问题修复
核心问题分析
- 视图初始化逻辑错误:不管请求是GET还是POST,一开始就用
request.POST绑定表单,GET请求时空数据直接导致表单无效;POST处理后无条件重置为空表单,就算验证成功也不会跳转,还会覆盖错误信息。 - 表单属性冗余:
username字段的minlength值带多余空格,可能干扰验证逻辑。 - 模板无错误提示:页面没渲染表单验证错误,根本不知道为啥注册失败。
修复代码
1. 修正views.py
def signup(request): # GET请求创建空表单,POST请求绑定提交数据 form = RegisterForm(request.POST or None) if request.method == 'POST': if form.is_valid(): print("User is valid") user = form.save() # 直接登录创建好的用户,无需额外authenticate authlogin(request, user) print("User created") # 必须return跳转,不然会继续执行后面的代码 return redirect('home') # 确保urls.py里有name为home的路由 print("Form invalid") # 不管是GET还是验证失败,都返回当前表单实例(含错误信息) print("User not created") return render(request, 'registration/signup.html', {'form': form})
2. 修正forms.py
class RegisterForm(UserCreationForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['username'].widget.attrs.update({ 'id':'RegisterUsername', 'type':"text", 'required':'', 'maxlength':'16', 'minlength':'4', # 去掉多余空格 }) self.fields['email'].widget.attrs.update({ 'id':'RegisterEmail', 'type':"email", 'required':'', }) self.fields['password1'].widget.attrs.update({ 'id':'RegisterPassword', 'type':"password", 'required':'', }) self.fields['password2'].widget.attrs.update({ 'id':'RegisterPassword2', 'type':"password", 'required':'', }) email = forms.EmailField(required=True) class Meta: model = User fields = ['username', 'email', 'password1', 'password2']
3. 完善signup.html(添加错误提示)
<div class="wrapper"> <div class="form-box login"> <h2>Register</h2> <form method='POST' id='signup-form' novalidate> {% csrf_token %} <!-- 显示全局表单错误 --> {% if form.non_field_errors %} <div class="error-message"> {{ form.non_field_errors }} </div> {% endif %} <div class="input-box"> <span class='icon'><ion-icon name="person"></ion-icon></span> {{form.username}} <label>Username</label> <!-- 显示字段错误 --> {% if form.username.errors %} <div class="error-text">{{ form.username.errors }}</div> {% endif %} </div> <div class="input-box"> <span class='icon'><ion-icon name="mail"></ion-icon></span> {{form.email}} <label>Email</label> {% if form.email.errors %} <div class="error-text">{{ form.email.errors }}</div> {% endif %} </div> <div class="input-box"> <span class='icon'><ion-icon name="lock-closed"></ion-icon></span> {{form.password1}} <label>Password</label> {% if form.password1.errors %} <div class="error-text">{{ form.password1.errors }}</div> {% endif %} </div> <div class="input-box"> <span class='icon'><ion-icon name="lock-closed"></ion-icon></span> {{form.password2}} <label>Confirm Password</label> {% if form.password2.errors %} <div class="error-text">{{ form.password2.errors }}</div> {% endif %} </div> <button type='submit' class='btn'>Register</button> </form>
内容的提问来源于stack exchange,提问作者Gterd
相关产品推荐
相关产品推荐

