Django实时聊天项目注册报错求助:Unknown field(s) (password1,password2)
Django注册表单FieldError问题解决
我正在为大学项目开发一款实时聊天应用,选用Django作为Web框架,看中它的灵活性。开发过程中解决了不少错误,但当前这个问题卡壳了,求助。
相关代码
forms.py
from django.contrib.auth.forms import UserChangeForm from django.contrib.auth.models import User from django.db import models from django import forms class SignupForm(UserChangeForm): class Meta: model = User fields = ['username', 'password1', 'password2']
urls.py
from django.urls import path from django.contrib.auth import views as auth_views from . import views urlpatterns = [ path('members/', views.members, name='members'), path('', views.frontpage, name='frontpage'), path('signup/', views.signup, name='signup'), path('login/', auth_views.LoginView.as_view(template_name='members\login.html'), name='login'), path('logout/', auth_views.LogoutView.as_view(), name='logout'), ]
views.py
from django.contrib.auth import login from django.shortcuts import render, redirect from .forms import SignUpForm def frontpage(request): return render(request, 'members\frontpage.html') def signup(request): if request.method == 'POST': form = SignUpForm(request.POST) if form.is_valid(): user = form.save() login(request) return redirect('frontpage') else: form = SignUpForm() return render(request, 'members/signup.html', {'form': form})
models.py
from django.db import models from django.contrib.auth.models import User class User(models.Model): username = models.CharField(max_length=255, blank= True, editable=True) password1 = models.CharField(max_length=30, null=True, blank=True, editable= True) password2 = models.CharField(max_length=30, null=True, blank=True, editable= True)
错误信息
Exception in thread django-main-thread: Traceback (most recent call last): File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.1008.0_x64__qbz5n2kfra8p0\Lib\threading.py", line 1073, in _bootstrap_inner self.run() File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.1008.0_x64__qbz5n2kfra8p0\Lib\threading.py", line 1010, in run self._target(*self._args, **self._kwargs) File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\utils\autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\core\management\commands\runserver.py", line 133, in inner_run self.check(display_num_errors=True) File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\core\management\base.py", line 486, in check all_issues = checks.run_checks( ^^^^^^^^^^^^^^^^^^ File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\core\checks\registry.py", line 88, in run_checks new_errors = check(app_configs=app_configs, databases=databases) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\core\checks\urls.py", line 14, in check_url_config return check_resolver(resolver) ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\core\checks\urls.py", line 24, in check_resolver return check_method() ^^^^^^^^^^^^^^ File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\urls\resolvers.py", line 519, in check for pattern in self.url_patterns: ^^^^^^^^^^^^^^^^^ File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\utils\functional.py", line 47, in __get__ res = instance.__dict__[self.name] = self.func(instance) ^^^^^^^^^^^^^^^^^^^ File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\urls\resolvers.py", line 738, in url_patterns patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) ^^^^^^^^^^^^^^^^^^^ File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\utils\functional.py", line 47, in __get__ res = instance.__dict__[self.name] = self.func(instance) ^^^^^^^^^^^^^^^^^^^ File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\urls\resolvers.py", line 731, in urlconf_module return import_module(self.urlconf_name) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.1008.0_x64__qbz5n2kfra8p0\Lib\importlib\__init__.py", line 90, in import_module return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen importlib._bootstrap>", line 1387, in _gcd_import File "<frozen importlib._bootstrap>", line 1360, in _find_and_load File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 935, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 995, in exec_module File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed File "C:\Users\bdjam\OneDrive\Bureau\project\chat\chat\urls.py", line 21, in <module> path('', include('members.urls')), ^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\urls\conf.py", line 39, in include urlconf_module = import_module(urlconf_module) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.1008.0_x64__qbz5n2kfra8p0\Lib\importlib\__init__.py", line 90, in import_module return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen importlib._bootstrap>", line 1387, in _gcd_import File "<frozen importlib._bootstrap>", line 1360, in _find_and_load File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 935, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 995, in exec_module File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed File "C:\Users\bdjam\OneDrive\Bureau\project\chat\members\urls.py", line 3, in <module> from . import views File "C:\Users\bdjam\OneDrive\Bureau\project\chat\members\views.py", line 5, in <module> from .forms import SignUpForm File "C:\Users\bdjam\OneDrive\Bureau\project\chat\members\forms.py", line 6, in <module> class SignupForm(UserChangeForm): File "C:\Users\bdjam\OneDrive\Bureau\project\chatapp\Lib\site-packages\django\forms\models.py", line 332, in __new__ raise FieldError(message) django.core.exceptions.FieldError: Unknown field(s) (password1, password2) specified for User
错误原因
- 模型冲突:自定义了
User模型,同时又导入了Django自带的auth.User,导致代码混淆。而且Django自带的User模型并没有password1、password2字段,这两个字段是UserCreationForm提供的表单字段,不属于模型本身。 - 表单选型错误:用
UserChangeForm做注册表单不合适,这个表单是用来修改已有用户信息的,注册应该用专门的UserCreationForm,它内置了password1和password2的字段及密码验证逻辑。 - 类名大小写不一致:
forms.py里的表单类是SignupForm,但views.py里导入的是SignUpForm,会导致导入错误。 - 路径转义问题:Windows下用反斜杠
\作为路径分隔符可能触发转义,导致模板找不到。
解决方案
1. 修正models.py
删掉自定义的User模型,直接使用Django自带的auth.User即可。如果需要扩展用户模型,应该继承AbstractUser而非重新定义同名模型。
# models.py from django.db import models # 移除自定义的User类,无需重复定义
2. 修正forms.py
替换表单基类为UserCreationForm,并统一类名为SignUpForm:
# forms.py from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User from django import forms class SignUpForm(UserCreationForm): class Meta: model = User fields = ['username', 'password1', 'password2']
3. 修正路径分隔符
将urls.py和views.py中的反斜杠\替换为正斜杠/:
urls.py修改:
path('login/', auth_views.LoginView.as_view(template_name='members/login.html'), name='login'),
views.py修改:
def frontpage(request): return render(request, 'members/frontpage.html')
4. 验证逻辑
views.py中的注册逻辑无需大改,现在表单会自动处理密码验证,调用form.save()会自动加密密码并创建用户。
内容的提问来源于stack exchange,提问作者Aymen Bensalah
相关产品推荐
相关产品推荐

