>我正在尝试创建自定义用户类,我想知道实现引用新用户的最佳实践。按照 Django docs 方法实现自定义用户后,models.py:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
和 settings.py
AUTH_USER_MODEL = 'myapp.MyUser'
和 admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
Django 文档说要使用设置。AUTH_USER_MODEL专门用于外键和一对一字段的用户,但不清楚其他实例。
我的问题特定于如何在 views.py 中引用自定义用户类。在定义我使用的用户类之前
from django.contrib.auth.models import User
但是在定义自定义类后,这不再正确。我已经看到样板代码在 views.py 开头使用此方法:
from django.contrib.auth import get_user_model
User = get_user_model()
这是引用自定义用户的最佳做法吗?或者我应该只使用设置。AUTH_USER_MODEL代替我以前拥有用户的位置?
使用设置。AUTH_USER_MODEL将在加载所有 Django 应用程序后延迟加载用户类。最初加载应用时,在模块级别调用 get_user_model(( 可能会导致用户模型应用未加载,并且还会导致循环导入。
更新:我读了两个具体问题:
如何正确访问用户模型、贡献或自定义。
Djangos get_user_model(( 很简单地使用settings.AUTH_USER_MODEL
调用 django.apps get_model((。如果要编写的应用可能会在其他用户模型的其他项目中重复使用,请使用get_user_model调用。总是。那么用户模型是什么就无关紧要了。
如果您已经创建了自己的core.User
模型,并且非常确信您的代码将仅用于此项目,那么from core.models import User
也可以工作。
何时使用设置中的字符串表示形式,而不是获取模型。
字符串表示最终通常会调用相同的 django.apps get_model((。通过在外键、OneToOneFields 等中给出一个字符串而不是类本身,你根本不需要在 django 应用程序导入期间查找模型,因为用户模型可能尚不可用。因此,使用字符串表示只是延迟加载模型。所有型号也是如此。
在 django 不同的主要版本中,这种行为也发生了变化,这是另一个话题。请注意,get_user_model(( 已在 Django 1.11 中更新用于导入。
https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#referencing-the-user-model
你可以选择get_user_model
而不是User
from django.contrib.auth import get_user_model
User = get_user_model()
get_user_model
将返回此项目中处于活动状态的用户模型。
如果您修改(将新字段添加到其中(默认User
您需要使用的表get_user_model
它将返回活动的用户表。
顺便说一句,User
将从django.contrib.auth.models
返回本地人