2015-11-12 8 views
4

У меня есть собственная пользовательская модель и ее собственный Manger.Пользовательская пользовательская модель пользователя django не хеширована

модели:

class MyUser(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(max_length=255, unique=True) 
    first_name = models.CharField(max_length=35) 
    last_name = models.CharField(max_length=35) 
    username = models.CharField(max_length=70, unique=True) 
    date_of_birth = models.DateField() 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

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

    def get_full_name(self): 
     return ('%s %s') % (self.first_name, self.last_name) 

    def get_short_name(self): 
     return self.username 

    objects = MyUserManager() 
    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['first_name', 'last_name', 'username', 'date_of_birth'] 

менеджер:

class MyUserManager(BaseUserManager): 
    def create_user(self, email, first_name, last_name, username, date_of_birth, password=None, **kwargs): 
     if not email: 
      raise ValueError('User must have an email address') 

     user = self.model(
      email=self.normalize_email(email), 
      first_name=first_name, 
      last_name=last_name, 
      username=username, 
      date_of_birth=date_of_birth, 
      **kwargs 
     ) 
     user.set_password(self.cleaned_data["password"]) 
     user.save(using=self._db) 
     return user 

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

Все работает при создании нового пользователя без каких-либо ошибок. Но когда я пытаюсь войти в систему, я не могу. Поэтому я проверил пароль пользователя для подтверждения, и пароль отображается как обычный текст strongpassword, а при изменении формы администратора для получения хешированного пароля с помощью ReadOnlyPasswordHashField. Я получаю сообщение об ошибке внутри поля пароля, хотя я использовал set_password() для Manger внутри create_user() функция.

Неверный формат пароля или неизвестный алгоритм хэширования

Однако, если я вручную делать set_password('strongpassword') для этого пользователя он затем хэшируются. Не могли бы вы помочь мне решить эту проблему. Спасибо.

+0

Я предполагаю, что ваш 'self.create_superuser' не вызывает ваш пользовательский' self.create_user', а вызывает по умолчанию. Можете ли вы поставить точку останова и проверить? – karthikr

+0

@karthikr Я понятия не имею, как поставить точку останова извините. –

ответ

6

Похоже, вы создали пользователя таким образом, чтобы не использовать метод create_user вашего менеджера, например, через администратора Django.

Если вы создаете пользовательский пользователь, вам необходимо определить пользовательскую модель и администратор модели, который правильно обрабатывает пароль.

В противном случае пароли не будут хэшироваться, когда пользователь будет создан с помощью администратора Django.

example in docs для создания пользовательских пользователей показывает, как создать модель и модель администратора.

+0

Да, именно так. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^