【发布时间】: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_active、is_staff等而不是active、staff等。 -
糟糕,我的 models.py 好像被切断了。我会编辑帖子。
-
我收回 - 只有第一行丢失了。
-
但据我所知,您从未将
UserManager的model设置为新的UserProfile。 -
我真的没有关注你。你能告诉我一个你认为我需要改变的例子/sn-p吗?谢谢!
标签: django