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)
Если этот пароль нужно потом использовать в коде, шифруйте другим методом, позволяющим расшифровать данные