Django自定义用户模型和usermanager

时间:2013-05-17 09:59:58

标签: python django django-models django-users

我正在使用Django 1.5构建一个Web应用程序。我正在使用自定义用户模型和自定义UserManager。 我按照官方Django文档的说明和示例进行操作。

现在,当我尝试通过UserManager.create_user(...)创建一个新用户时,我收到一个NoneType错误:似乎UserManager的属性模型是None类型。 我想我正在用户模型(objects = UserManager()

中正确设置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错误

4 个答案:

答案 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()

希望这有助于节省其他人的时间...