我正在尝试创建自定义用户类,并且我想知道实现引用新用户的最佳实践。遵循在models.py中实现自定义用户的Django docs方法,如下所示:
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文档说使用settings.AUTH_USER_MODEL代替专门用于ForeignKeys和OnetoOneField的用户,但是其他实例并不清楚。
我的问题特定于如何在views.py中引用自定义用户类。在定义我正在使用的用户类之前
from django.contrib.auth.models import User
但是在定义自定义类之后,这不再正确。我见过样板代码在views.py:
的开头使用了这个方法from django.contrib.auth import get_user_model
User = get_user_model()
这是引用自定义用户的最佳做法吗?或者我应该使用settings.AUTH_USER_MODEL代替我之前有用户的位置?
答案 0 :(得分:5)
使用settings.AUTH_USER_MODEL将在加载所有django应用程序后懒洋洋地加载用户类。在最初加载应用程序时,在模块级别调用get_user_model()可能会导致未加载用户模型应用程序以及循环导入。
如何正确访问用户模型,contrib或custom。
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()。通过在Foreignkeys,OneToOneFields等中提供字符串而不是类本身,您根本不需要在django app导入期间查找模型,其中用户模型可能尚未可用。因此,使用字符串表示只是延迟加载模型。所有模型都是如此。
同样在djangos不同的主要版本中,这种行为也发生了变化,这是另一个话题。请注意,get_user_model()已在Django 1.11中更新以供导入使用。
https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#referencing-the-user-model
答案 1 :(得分:2)
您可以使用get_user_model
代替User
from django.contrib.auth import get_user_model
User = get_user_model()
get_user_model
将返回此项目中处于活动状态的用户模型。
如果您修改(在其中添加新字段)默认User
表,则需要使用get_user_model
它将返回活动用户表。
BTW User
将从django.contrib.auth.models