【问题标题】:Django: Cannot resolve keyword "is_active'' on /accounts/password_reset/Django:无法解析 /accounts/password_reset/ 上的关键字“is_active”
【发布时间】:2018-05-30 13:49:11
【问题描述】:

我正在尝试使用我的自定义用户模型实现 Django 的内置密码重置功能,但是当我尝试在 /accounts/password_reset/ 提交电子邮件地址时遇到此错误:

FieldError at /accounts/password_reset/
Cannot resolve keyword 'is_active' into field. Choices are: ...

 

异常位置:

Exception Location: C:\Users\...\.virtualenvs\my_project-IsNTW6sC\lib\site-packages\django\db\models\sql\query.py in names_to_path, line 1378

如果有人想看,我可以提供完整的回溯,但它真的很长,而且都指向后端 Django 文件。

 

这里是 models.py:

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, is_staff=False, is_admin=False, is_active=True):
        if not email:
            raise ValueError('Users must have an email address.')
        if not password:
            raise ValueError('Users must have a password.')

        user = self.model(
                email = self.normalize_email(email)
            )
        user.staff = is_staff
        user.admin = is_admin
        user.active = is_active
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_staffuser(self, email, password=None):
        user = self.create_user(
                email,
                password=password,
                is_staff=True
            )
        return user

    def create_superuser(self, email, password=None):
        user = self.create_user(
                email,
                password=password,
                is_staff=True,
                is_admin=True
            )
        return user



class User(AbstractBaseUser):
    email = models.EmailField(max_length=254, unique=True)
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [] # USERNAME_field (email) and pw required by default
    objects = UserManager()

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active



class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    username = models.CharField(max_length=200, unique=True, blank=False, validators=[
        RegexValidator(
            regex='^[a-z0-9_-]*$',
            message='Usernames can only contain letters, numbers, underscores, and dashes.'
            )
        ])
    first_name = models.CharField(max_length=200, blank=False)
    last_name = models.CharField(max_length=200, blank=False)
    city = models.CharField(max_length=30, blank=True)
    state_or_province = models.CharField(max_length=2, choices=all_choices, default='')
    bio = models.TextField(max_length=500, blank=True)
    date_joined = models.DateField(auto_now_add=True)
    cc_reference = models.CharField(max_length=200, default=False)
    event_list = ArrayField(models.IntegerField(), default=list)

    def _get_username(self):
        username = self.user.email
        return username

    def _get_firstname(self):
        firstname = self.user.email
        return firstname

    def _get_lastname(self):
        lastname = self.user.email
        return lastname

    def save(self, *args, **kwargs):
        if not self.username:
            self.username = self._get_username()
            self.first_name = self._get_firstname()
            self.last_name = self._get_lastname()
        super().save()

@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
    instance.userprofile.save()

感谢任何帮助。谢谢!

 

编辑:

感谢下面的回答,我修复了密码重置问题。但是,我现在无法将我的超级用户登录到管理页面。新用户模型如下。我没有更改 UserManager:

class User(AbstractBaseUser):
    email = models.EmailField(max_length=254, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [] # USERNAME_field (email) and pw required by default
    objects = UserManager()

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

【问题讨论】:

  • 您是否更改了User 模型?如果不是,这不应该是is_activeis_staff 等而不是activestaff 等。
  • 糟糕,我的 models.py 好像被切断了。我会编辑帖子。
  • 我收回 - 只有第一行丢失了。
  • 但据我所知,您从未将UserManagermodel 设置为新的UserProfile
  • 我真的没有关注你。你能告诉我一个你认为我需要改变的例子/sn-p吗?谢谢!

标签: django


【解决方案1】:

就我而言,我刚刚将字段 active 重命名为 is_active 并删除了 is_active @property 函数。 然后,当我makemigrations 它问我是否要将active 字段重命名为is_active,然后我点击Y 进行迁移。 最后,我migrate对数据库的改动。 它没有任何错误。

【讨论】:

    【解决方案2】:

    您的模型定义字段 activeadminstaff,而不是 is_adminis_staffis_active

    【讨论】:

    • 当我将active 更改为is_active 时,我仍然收到错误消息。即使我创建一个新字段is_active,然后运行manage.py makemigrations,它也只会记录我删除了active。它没有注册我添加了is_active。是否有可能一旦您进行了用户设置,就无法更改模型?我认为我没有在完全从头开始的数据库上对其进行测试。
    • 您已经使用属性方法隐藏了这些字段。你应该删除那些。
    • 嗯,好的。我回家后会试试这个!
    • 非常感谢,这成功了!但是,它似乎确实破坏了其他东西,因为现在我的超级用户无法登录到管理页面,哈哈。有任何想法吗?我使用新的用户模型代码对我的原始帖子进行了编辑。
    • 您是否更改了 Manager create_user 方法中的代码?否则它仍在设置activestaff
    【解决方案3】:

    MyUser类中,可能有三个函数:

    def is_staff(self):
        return self.is_staff
    
    def is_admin(self):
        return self.is_admin
    
    def is_active(self):
        return self.is_active
    

    我相信这些名字的重复会造成冲突。

    • 如果可能,请从您的自定义 User 中删除 staff
    • 删除后续函数:不需要(注意:只有函数,不是对象)
       def is_active(self):
            return self.is_active
    
    • 重命名 u/m 函数(你可以使用 is_staff(self) 调用 is_admin:
       def is_staff(self):
           return self.is_admin
    

    这将消除冲突,你们两个问题都会得到解决。

    注意:您还必须从MyUserManager 类中删除createstaffuser() 函数,并且您必须将adminactive(无论您在哪里使用它们)更改为@987654331 @ 和 is_active 分别。最后,您必须从管理员、表单和模型中删除人员。

    我希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      尝试将 is_superuser 字段添加到用户模型中,然后迁移更改。

      之后,使用终端/cmd 创建超级用户,然后尝试以超级用户 agian 身份登录

      【讨论】:

        猜你喜欢
        • 2018-11-23
        • 1970-01-01
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        相关资源
        最近更新 更多