Django注册页面触发KeyError 'email'问题求助
Django注册页面KeyError 'email'问题解决
错误原因分析
- 表单类Meta定义缩进错误:
forms.py中Meta类未缩进在RegistrationForm内部,导致Django无法识别自定义字段,而UserCreationForm默认不包含email字段,触发KeyError。 - URL配置错误:
registration/urls.py中路径开头多了斜杠/register,结合根URL的accounts/会生成无效路径accounts//register。- 根目录
urls.py未包含自定义registration应用的路由,请求无法匹配到正确视图。 - 路由指向的
views.register函数未处理请求、未返回响应,实际处理注册逻辑的是sign_up函数。
- 视图函数逻辑错误:
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
相关产品推荐
相关产品推荐

