Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 经理是';t可用;用户已被换为';宠物人';_Django - Fatal编程技术网

Django 经理是';t可用;用户已被换为';宠物人';

Django 经理是';t可用;用户已被换为';宠物人';,django,Django,我在django中使用默认用户模型已经有一段时间了,我意识到,如果需要进一步增强它,我必须在django 1.5中创建自己的自定义用户模型 我创建了我的自定义用户模型,我有一个允许用户登录的功能。 我认为我的自定义用户模型与我的函数不兼容,因为它不允许我执行request.user。如何修复此问题,以便再次使用request.user 观点 模型 class PersonManager(BaseUserManager): def create_user(self, email,dat

我在django中使用默认用户模型已经有一段时间了,我意识到,如果需要进一步增强它,我必须在django 1.5中创建自己的自定义用户模型

我创建了我的自定义用户模型,我有一个允许用户登录的功能。 我认为我的自定义用户模型与我的函数不兼容,因为它不允许我执行request.user。如何修复此问题,以便再次使用request.user

观点

模型

 class PersonManager(BaseUserManager):
     def create_user(self, email,date_of_birth, username,password=None,):
         if not email:
             msg = 'Users must have an email address'
             raise ValueError(msg)

         if not username:
              msg = 'This username is not valid'
        raise ValueError(msg)

         if not date_of_birth:
             msg = 'Please Verify Your DOB'
             raise ValueError(msg)

         user = self.model(

 email=PersonManager.normalize_email(email),username=username,date_of_birth=date_of_birth)

         user.set_password(password)
         user.save(using=self._db)
         return user

     def create_superuser(self,email,username,password,date_of_birth):
         user = self.create_user(email,password=password,username=username,date_of_birth=date_of_birth)
         user.is_admin = True
         user.is_staff = True
         user.is_superuser = True
         user.save(using=self._db)
         return user


 class Person(AbstractBaseUser, PermissionsMixin):

     email = models.EmailField(verbose_name='email address',max_length=255,unique=True,db_index=True,)
     username = models.CharField(max_length=255, unique=True)
     date_of_birth = models.DateField()

     USERNAME_FIELD = 'email'
     REQUIRED_FIELDS = ['username', 'date_of_birth',]

     is_active = models.BooleanField(default=True)
     is_admin = models.BooleanField(default=False)
     is_staff = models.BooleanField(default=False)

     objects = PersonManager()

     def get_full_name(self):
         return self.email

     def get_short_name(self):
         return self.email

     def __unicode__(self):
         return self.email

问题是,
User
引用了
django.contrib.auth.models.User
,现在您有了一个
自定义用户
pet.Person
,假设您在
settings.py

AUTH_USER_MODEL = "pet.Person"
您必须使用
自定义用户
模型定义
用户
,您可以使用使用
用户

from django.contrib.auth import get_user_model
User = get_user_model()

现在,您将能够使用
自定义用户
模型,问题已得到解决。

对于可能遇到此问题的任何其他人,我也通过在forms.py上执行此操作来解决此问题:

将其添加到forms.py文件的顶部

from .models import YourCustomUser
然后将其添加到
forms.py CustomUser
表单:

class SignUpForm(UserCreationForm):
#profile_year        = blaaa blaa blaaa irrelevant.. You have your own stuff here don't worry about it

   # here is the important part.. add a class Meta-
   class Meta:
      model = YourCustomUser #this is the "YourCustomUser" that you imported at the top of the file  
      fields = ('username', 'password1', 'password2', #etc etc, other fields you want displayed on the form)
大音符,注意

  • 这个代码适用于我的案例。我有一个注册用户的视图,我在这里遇到了一个问题,我解决了它,我还没有尝试登录用户

  • include=()
    部分是必需的,或者您可以添加
    exclude=()
    ,但您必须有一个


  • 更新上述解决方案的重要注意事项。。。 如果您面临这种问题,您可能已经尝试过各种web解决方案,告诉您将
    AUTH\u USER\u 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.objects.get()
    
    因为您知道您已经将
    objects=UserManager()
    放在自定义用户类中(
    UserManager
    是扩展
    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
    
    不等同于:

    get_user_model().objects.get() # without the need for User = get_user_model() anywhere
    
    也许不直观,但事实证明,在python中,在导入时执行一次
    User=get\u User\u model()
    不会导致在后续调用中定义
    User
    (即,它不会将
    User
    转换为“常量”如果您来自C/C++背景,您可能会想到的种类;这意味着
    User=get\u User\u model()
    的执行发生在导入时,但随后在该文件中调用类或函数/方法之前被取消引用)

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


    希望这能帮助其他人节省一些时间…

    以上提供的所有解决方案在我的情况下都不起作用。如果您使用Django 3.1版,则有另一种解决方案:


    在auth/forms中,注释掉第10行,并将第104和153行中的模型更改为您定义的模型。

    forms.py

    AUTH_USER_MODEL = "pet.Person"
    
    从django.contrib.auth.models导入用户更改为

    from djangi.contrib.auth import get_user_model
    
    然后在顶部添加以下代码

    User = get_user_model()
    

    您好,这看起来可以解决我的问题-我想知道代码应该放在哪个文件中?谢谢@GershomMaes AUTH_USER_MODEL inside settings.py和视图中的其他代码,或者无论您在何处使用该用户模型,我们都欢迎您:非常感谢!如果您正在文档中查找此信息:可能这与此问题无关,我只想注意相同的错误消息。在Django 3.0.4中,我使用了.UserChangeForm的contrib.auth.forms.UserCreationForm,它们的元类中都有model=User硬编码(而不是=UserModel,该文件中的UserModel等于get_User_model()。我做了PR,但我不知道替换用户->用户模型是否正确,Django项目中有许多PR正在等待。警告:您应该使用
    设置的状态。AUTH\u User\u MODEL
    get\u User\u MODEL()
    而不是此方法。我不确定这是否只是一个惯例,或者是否存在安全问题。
    User = get_user_model()