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

Django注册页面触发KeyError 'email'问题求助

Django注册页面KeyError 'email'问题解决

错误原因分析

  1. 表单类Meta定义缩进错误:forms.py中Meta类未缩进在RegistrationForm内部,导致Django无法识别自定义字段,而UserCreationForm默认不包含email字段,触发KeyError。
  2. URL配置错误:
    • registration/urls.py中路径开头多了斜杠/register,结合根URL的accounts/会生成无效路径accounts//register。
    • 根目录urls.py未包含自定义registration应用的路由,请求无法匹配到正确视图。
    • 路由指向的views.register函数未处理请求、未返回响应,实际处理注册逻辑的是sign_up函数。
  3. 视图函数逻辑错误:sign_up函数中表单验证失败时,重新创建空表单,丢失了错误提示信息。

修复步骤及修正后代码

1. 修正forms.py的Meta类缩进

将Meta类缩进至RegistrationForm内部,确保Django识别自定义字段:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class RegistrationForm(UserCreationForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['email'].label = '邮箱地址'
        self.fields['password1'].label = '密码'
        self.fields['password2'].label = '确认密码'

    class Meta:
        model = User
        fields = ('email', 'password1', 'password2')

2. 修正registration/urls.py的路由配置

去掉路径开头的斜杠,并将视图指向正确的sign_up函数:

from django.contrib.auth import views as auth_views
from django.urls import path
from . import views

urlpatterns = [
    path('register', views.sign_up, name='register'),
]

3. 修正根目录urls.py,添加registration路由

在urlpatterns中添加自定义registration应用的路由:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('main.urls')),
    path('news/', include('news.urls')),
    path('accounts/', include('registration.urls')),
    path('accounts/', include('django.contrib.auth.urls')),
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

4. 修正views.py的视图逻辑

删除无用的register函数,保留验证失败的表单以显示错误信息:

from django.shortcuts import render, redirect
from django.contrib.auth import login
from .forms import RegistrationForm


def sign_up(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')
    else:
        form = RegistrationForm()
    return render(request, 'registration/register.html', {'form': form})

5. 可选:优化模板显示错误信息

在register.html中添加表单错误提示:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
    <h1>注册</h1>
    <form method="post" action="{% url 'register' %}">
        {% csrf_token %}
        {% if form.errors %}
            <div style="color: red;">
                {% for field in form %}
                    {% for error in field.errors %}
                        <p>{{ error }}</p>
                    {% endfor %}
                {% endfor %}
                {% for error in form.non_field_errors %}
                    <p>{{ error }}</p>
                {% endfor %}
            </div>
        {% endif %}
        {{ form.email }}
        {{ form.password1 }}
        {{ form.password2 }}
        <button type="submit">注册</button>
    </form>
</body>
</html>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:52:47