【问题标题】:Django issues creating a custom user modelDjango 创建自定义用户模型时出现问题
【发布时间】:2019-03-05 21:04:16
【问题描述】:

我尝试切换到自定义用户身份验证,以便在需要时更轻松地更改用户模型。我正在查看https://docs.djangoproject.com/en/2.1/topics/auth/customizing/ 此处的文档,但现在我的表单有问题。

models.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)

非常感谢任何帮助。

【问题讨论】:

    标签: django authentication


    【解决方案1】:

    AbstractBaseUser 类不包含任何模型字段(密码和上次登录字段除外),因此即使在理论上也无法正常工作。您应该在 DefaultUser 模型类中定义模型字段以供其使用,检查example

    由于您还没有注册它的管理类,所以管理部分也不会起作用。

    如果您仔细阅读此文档,您最终应该会得到它。

    AbstractBaseUser 类你也可以在源代码中查看BaseUser 以获得一些提示

    【讨论】:

    • 所以我尝试在完整示例中进行更改,但我仍然在运行迁移时遇到问题我收到“ModuleNotFoundError: No module named 'accounts.DefaultUser'” 该应用程序称为帐户,我也有给它命名空间帐户。然后在 models.py 中,这个类被命名为 DefaultUser。我在这里做错了吗?
    猜你喜欢
    • 2019-10-17
    • 2019-09-17
    • 1970-01-01
    • 2020-08-22
    • 2017-10-27
    • 1970-01-01
    • 2021-07-12
    • 2019-01-12
    • 2014-10-04
    相关资源
    最近更新 更多