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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:15:31