django - Django 创建自定义用户模型时出现问题
问题描述
我尝试切换到自定义用户身份验证,以便在需要时更轻松地更改用户模型。我在这里查看文档https://docs.djangoproject.com/en/2.1/topics/auth/customizing/但我现在遇到了我的表单问题。
模型.py
from django.contrib.auth.models import AbstractBaseUser
class DefaultUser(AbstractBaseUser):
pass
Forms.py 包含以下内容
from .models import DefaultUser
from django.core.validators import EmailValidator
from django.utils.crypto import get_random_string
from django.contrib.auth import password_validation
from django import forms
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.forms import UsernameField
class UserCreateForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and
password.
"""
error_messages = {
'password_mismatch': _("The two password fields didn't match."),
'Invalid_Email_Address': _("Invalid Email Address"),
}
password1 = forms.CharField(
label=_("Password"),
strip=False,
widget=forms.PasswordInput,
help_text=password_validation.password_validators_help_text_html(),
)
password2 = forms.CharField(
label=_("Password confirmation"),
widget=forms.PasswordInput,
strip=False,
help_text=_("Enter the same password as before, for verification."),
)
class Meta:
model = DefaultUser
fields = [
"username",
"first_name",
"last_name",
]
field_classes = {'username': UsernameField}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self._meta.model.USERNAME_FIELD in self.fields:
self.fields[self._meta.model.USERNAME_FIELD].widget.attrs.update({'autofocus': True})
self.fields[self._meta.model.USERNAME_FIELD].label = 'Email'
def clean_username(self):
username = self.cleaned_data.get('username')
validate_username_is_email = EmailValidator()
print(username)
print(validate_username_is_email(username))
if validate_username_is_email(username):
raise forms.ValidationError(
self.error_messages['Invalid_Email_Address'],
code='Invalid_Email_Address',
)
return username
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'],
code='password_mismatch',
)
return password2
def _post_clean(self):
super()._post_clean()
# Validate the password after self.instance is updated with form data
# by super().
password = self.cleaned_data.get('password2')
if password:
try:
password_validation.validate_password(password, self.instance)
except forms.ValidationError as error:
self.add_error('password2', error)
def save(self, commit=True):
user = super().save(commit=False)
user.email = self.cleaned_data.get('username')
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
当我尝试运行迁移时发生的错误是 django.core.exceptions.FieldError: Unknown field(s) (first_name, last_name, username) specified for DefaultUser这似乎是由我的表单中的 Meta 类引起的,因为如果我带走错误更改的字段。虽然当 Meta 指向 model = User 时一切正常。
另外,我确实将此添加到我的设置页面
AUTH_USER_MODEL = "accounts.DefaultUser"
并且 admin.py 有
from django.contrib import admin
from .models import DefaultUser
admin.site.register(DefaultUser)
任何帮助是极大的赞赏。
解决方案
AbstractBaseUser类不包含任何模型字段(密码和上次登录字段除外),因此即使在理论上也无法运行。您应该在 DefaultUser 模型类中定义模型字段以供其使用,请查看示例。
由于您尚未注册它的 Admin 类,因此 admin 部分也不会起作用。
如果您更仔细地阅读此文档,您最终应该会得到它。
AbstractBaseUser类,您也可以在源代码中检查BaseUser以获得一些提示
推荐阅读
- delphi - 在 Windows 7 上使用 Delphi 2010 时的 IDE 下划线错误
- python - 使用 python 多处理池访问拆分文件,搜索字节流,然后连接值
- ansible - 当wait_for不够时等待服务在ansible中启动
- c# - .NET Core 2 构建在 .NET Core 3.1 中不起作用
- javascript - 使用 beforeProcessing 或 beforeRequest 事件显示消息
- powerbuilder - 如何使用快捷栏和 xplistbar 创建用户访问权限
- javascript - Javascript / TypeScript 订阅中使用 Promise 时的潜在竞争条件
- c# - EF Core 5:使用与 FK 相同的 PK 配置拥有的类型且没有父属性
- jekyll - 仅在第一次运行时调用 Jekyll 生成器插件,而不是在重新生成时调用
- javascript - Fabric JS - 使用 JSON diff 进行 UNDO 和 REDO 优化