8

我正在使用 Django 1.5 构建一个 Web 应用程序。我正在使用带有自定义 UserManager 的自定义用户模型。我遵循了官方 Django 文档的说明和示例。

现在,当我尝试通过创建新用户时 UserManager.create_user(...) 出现 NoneType 错误:看来 UserManager 的属性模型是 None 类型。我想我在 User 模型中正确设置了 UserManager ( objects = UserManager() )

我真的不知道我在哪里犯了错误。Booth 我的编码伙伴和我是 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'

我在user = self.model(..)UserManager 的 create_user() 方法的行中收到 NoneType 错误

4

5 回答 5

9

我在保存自定义用户模型时也遇到了问题,我花了一段时间才弄清楚我们的

我认为您的代码中的重要行是:

objects     =   UserManager()

在 User 类中,因此为了保存新用户,您需要调用

new_user=User.objects.create_user(args, args, args, etc)

objects”是调用UserManager类的项目,在django

于 2014-05-19T18:44:00.807 回答
8

要创建新用户,您不应调用UserManager.create_user(...). 相反,您应该使用:

from django.contrib.auth import get_user_model
get_user_model().objects.create_user(...)

这就是 django 管理器的工作方式。你可以在这里阅读文档

于 2013-05-17T10:08:14.413 回答
2

我不得不添加一个答案,因为我没有足够的代表发表评论。但是@Aldarund 的答案中的链接根本没有描述 get_user_model() 的使用。但是,此链接应该会有所帮助...

于 2013-09-27T07:29:35.703 回答
2

更新解决方案的重要警告......如果您遇到此类问题,您可能已经尝试了网络上的各种解决方案,告诉您添加AUTH_USER_MODEL = users.CustomUser然后settings.py添加以下代码views.py 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作为扩展的自定义管理器的名称BaseUserManager)。

事实证明(感谢@Aldarund)正在做:

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

不等于:

get_user_model().objects.get() # without the need for User = get_user_model() anywhere

也许不直观,但事实证明,在 python 中,User = get_user_model()在导入时执行一次不会导致在User后续调用中被定义(即它不会变成User你可能期望的“常量”,如果你' re 来自 C/C++ 背景;意味着 的执行User = get_user_model()发生在导入时,但随后在随后调用该文件中的类或函数/方法之前被取消引用)。

综上所述,在所有引用User该类的文件中(例如调用函数或变量User.objects.get() User.objects.all() User.DoesNotExist等...):

# Add the following import line
from django.contrib.auth import get_user_model

# Replace all references to User with get_user_model() such as...
user = get_user_model().objects.get(pk=uid)
# instead of  user = User.objects.get(pk=uid)
# or
queryset = get_user_model().objects.all()
# instead of queryset = User.objects.all()
# etc...

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

于 2019-06-19T15:17:08.970 回答
0

在我的情况下,如果你出错了"manager_method" missing 1 required positional argument: 'self' django,你应该注意到不像需要设置为打击model.ManagerUserManager

from django.contrib.auth.models import AbstractUser, UserManager
from django.db.models import Q

class CostumUserManager(UserManager ):
    
    def authors(self):
        return self.filter(Q(is_author=True) | Q(is_superuser=True))


class User(AbstractUser):
    is_author = models.BooleanField(default=False, )


    objects = CostumUserManager() # Use () in end of it

于 2022-02-27T21:40:20.310 回答