如果我只想使用标准用户模型,如何使用AUTH_USER_模型

2024-05-19 02:53:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我看过几篇关于在settings.py中设置AUTH_USER_MODEL的最佳实践的帖子和read the documentation,但没有看到任何关于如何设置的实际示例。我尝试了几种配置,但不断出现以下错误:

django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'auth.User' that has not been installed

它甚至没有告诉我错误发生在哪里。以下是我尝试过的方法:

方法1:

from django.contrib.auth import get_user_model
User = get_user_model()

然后我会像这样引用我的用户:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

方法2:

from django.contrib.auth.models import User

两者都不起作用,如果我只想使用标准用户模型,我不确定如何在settings.py中设置AUTH_USER_MODEL。我根本没有自定义用户对象。我假设有点像AUTH_USER_MODEL = 'django.contrib.auth.models.User',但我不确定

现在我明白了:

AttributeError: 'str' object has no attribute '_meta'

用户/forms.py

from django import forms
from django.conf import settings
from django.contrib.auth.forms import UserCreationForm
from .models import Profile


class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = settings.AUTH_USER_MODEL
        fields = ['username', 'email', 'password1', 'password2']


class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = settings.AUTH_USER_MODEL
        fields = ['username', 'email']

Tags: django用户fromimportauthmodelsettingsmodels
3条回答

I assume something like AUTH_USER_MODEL = 'django.contrib.auth.models.User' but i'm not sure.

您使用app_name.ModelName引用模型,因此在本例中:

# settings.py

AUTH_USER_MODEL = 'auth.User'

这也是的默认值,因此如果您想使用Django的用户模型,只需省略settings.py中的AUTH_USER_MODEL设置即可

此外,您需要将django.contrib.auth添加到INSTALLED_APPS中,以便:

# settings.py

INSTALLED_APPS = [
    # …,
    'django.contrib.auth',
    # …,
]

ModelFormModelSerializer等中,使用get_user_model()获取对用户模型类的引用:

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model
from .models import Profile

User = get_user_model()


class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']


class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email']

你可以这么做

型号.py

from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User , on_delete=models.DO_WhatEver_You_Want)

我同意威廉的观点。如果你想保留这个,我推荐如下

在你的方法1中

from django.contrib.auth import get_user_model
User = get_user_model()

然后在views.py中,使用get_user_model()而不是User。 我希望对你的情况有效

相关问题 更多 >

    热门问题