Я создал модель, унаследованную от django.contrib.auth.models.User , и расширил ее дополнительными полями, а затем создал прокси, который переопределяет метод save () дляхэшируйте пароль, но пользователи, созданные через этот прокси, не могут войти.Я проследил процесс и обнаружил, что user.check_password()
всегда терпит неудачу, но я не знаю причину.
Это моя модель и ее прокси:
class UserExtended(User):
albums = models.ManyToManyField(Album, null=True, blank=True, verbose_name='Albums')
class Meta:
verbose_name = _("User")
verbose_name_plural = _("Users")
def __str__(self):
return "[{}] {} ({})({}{})".format(self.id, self.email, self.username, self.first_name, self.last_name)
class UserExtendedProxy(UserExtended):
class Meta:
proxy = True
def save(self, *args, **kwargs):
if not self.id:
try:
user = User.objects.get(email=self.email)
except:
pass
else:
raise Exception('eMail already in use.')
self.set_password(self.password)
super(UserExtendedProxy, self).save(*args, **kwargs)
Token.objects.create(user=self)
И это мое ModelBackend :
class EmailBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwars):
UserModel = get_user_model()
try:
user = UserModel.objects.get(email=username)
except UserModel.DoesNotExist:
return None
else:
if user.check_password(password):
return user
return None
В моей базе данных видно, что пользователи, созданные с помощью этого прокси-сервера, действительно существуют в модели django.contrib.auth.models.User , поэтому яне могу понять, почему они не могут войти в систему.
Другая проблема заключается в том, что суперпользователь, созданный с помощью python manage.py createsuperuser
, не существует для UserExtendedProxy .