我正在使用Django 1.5构建一个Web应用程序。我正在使用自定义用户模型和自定义UserManager。 我按照官方Django文档的说明和示例进行操作。
现在,当我尝试通过UserManager.create_user(...)
创建一个新用户时,我收到一个NoneType错误:似乎UserManager的属性模型是None类型。
我想我正在用户模型(objects = UserManager()
)
我真的不知道我在哪里弄错了。展示我的编码伙伴,我是Django的新手。也许你可以帮助我们。
以下是代码:
class UserManager(BaseUserManager):
"""
create a new user
@param username: the name for the new user
@param password: the password for the new user. if none is provided a random password is generated
@param person: the corresponding person object for this user
"""
def create_user(self, username, person, password=None):
if not username:
raise ValueError('User must have a valid username')
user = self.model(username=username, created=datetime.now(), must_change_password=True, deleted=False, person=person)
user.set_password(password)
user.save(using=self._db)
return user
class User(AbstractBaseUser):
## the id of the user. unique through the application
user_id = models.AutoField(primary_key=True)
## the name of the user. unique through the application
username = models.CharField(max_length=32, unique=True)
## the date when the user was created
created = models.DateTimeField()
## iff this is true the user must set a new password at next login
must_change_password = models.BooleanField(default=True)
## iff true the user is marked as deleted and can not login
deleted = models.BooleanField(default=False)
## iff true the user is admin and has all permissions. use with care!
is_admin = models.BooleanField(default=False)
## reference to the person entity that is linked to this specific user
person = models.ForeignKey(Person)
## indicates if the user is active or not
active = models.BooleanField(default=True)
## define the user manager class for User
objects = UserManager()
# necessary to use the django authentication framework: this field is used as username
USERNAME_FIELD = 'username'
我在UserManager的create_user()方法中的第user = self.model(..)
行收到NoneType错误
答案 0 :(得分:6)
要创建新用户,您不应该致电UserManager.create_user(...)
。相反,你应该使用:
from django.contrib.auth import get_user_model
get_user_model().objects.create_user(...)
这是django经理的工作方式。您可以阅读文档here
答案 1 :(得分:5)
我在保存自定义用户模型方面也遇到了问题,我花了很多时间来计算它们
我认为代码中的重要部分是:
objects = UserManager()
在User类中,因此为了保存您需要调用的新用户
new_user=User.objects.create_user(args, args, args, etc)
" objects
"是调用UserManager
类的项目,在django
答案 2 :(得分:2)
我不得不添加一个答案,因为我没有足够的代表发表评论。但是@ Aldarund的答案中的链接并没有描述get_user_model()的使用。但是,this link应该有帮助...
答案 3 :(得分:0)
重要警告,请更新解决方案...
如果您遇到此类问题,则可能已经在网络上尝试了各种解决方案,告诉您将AUTH_USER_MODEL = users.CustomUser
添加到settings.py
,然后将以下代码添加到views.py
{{ 1}}和其他任何调用forms.py
的文件:
User
然后在出现错误时挠头:
from django.contrib.auth import get_user_model
User = get_user_model()
只要您的代码引用Manager isn't available; 'auth.User' has been swapped for 'users.User'
,例如:
User
因为您知道已经将User.objects.get()
放入了自定义用户类中(objects = UserManager()
是扩展了UserManager
的自定义管理器的名称)。
事实证明(谢谢@Aldarund)正在做:
BaseUserManager
不等同于:
User = get_user_model() # somewhere at the top of your .py file
# followed by
User.objects.get() # in a function/method of that same file
也许不直观,但是事实证明,在python中,在导入时执行一次get_user_model().objects.get() # without the need for User = get_user_model() anywhere
并不会导致在后续调用中定义User = get_user_model()
(即,它不会变成{ {1}}转换为“常数”,如果您来自C / C ++背景,可能会期望它;这意味着User
的执行在导入时发生,但随后被取消引用在随后对该文件中的类或函数/方法进行调用之前)。
总而言之,在所有引用User
类的文件中(例如,调用函数或变量,例如User = get_user_model()
User
User.objects.get()
等):< / p>
User.objects.all()
希望这有助于节省其他人的时间...