Django. Использование password field в своей модели

В модели требуется использовать поле для ввода пароля. Необходимо, что бы пароль хранился в базе в зашифрованном виде. Пробовал реализовать вот так, но в поле input виден введённый текст. Прошу оказать помощь и указать где я допустил ошибку

model.py

class Сlient(models.Model):
    client_name = models.CharField('Название клиента', max_length=100)
    password = models.CharField('Пароль', max_length=100)

forms.py

class ClientConfigForm(forms.Form):
    class Meta:
        model = Client
        fields = ['password']
        widgets = {
            'password': forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Пароль', 'id': 'inputPassword', 'name': 'password', 'type': 'password', 'autocomplete': 'off'}),
    }

Ответы (1 шт):

Автор решения: Za Ars

Вы всегда можете посмотреть, как сделано в django. Вот как сделано в классе AbstractBaseUser


from django.contrib.auth.hashers import (
    check_password, is_password_usable, make_password,
)
...

class AbstractBaseUser(models.Model):
    password = models.CharField(_('password'), max_length=128)
    ...

    # Stores the raw password if set_password() is called so that it can
    # be passed to password_changed() after the model is saved.
    _password = None

    class Meta:
        abstract = True

    ...
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        if self._password is not None:
            password_validation.password_changed(self._password, self)
            self._password = None

    ...

    def set_password(self, raw_password):
        self.password = make_password(raw_password)
        self._password = raw_password

    def check_password(self, raw_password):
        """
        Return a boolean of whether the raw_password was correct. Handles
        hashing formats behind the scenes.
        """
        def setter(raw_password):
            self.set_password(raw_password)
            # Password hash upgrades shouldn't be considered password changes.
            self._password = None
            self.save(update_fields=["password"])
        return check_password(raw_password, self.password, setter)

    def set_unusable_password(self):
        # Set a value that will never be a valid hash
        self.password = make_password(None)

    def has_usable_password(self):
        """
        Return False if set_unusable_password() has been called for this user.
        """
        return is_password_usable(self.password)

Если этот пароль нужно потом использовать в коде, шифруйте другим методом, позволяющим расшифровать данные

→ Ссылка