Как токенизировать/шифровать поля в django?

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

user = User.objects.create(...)
user.set_password('Password123')
user.save()
#then in login I have to run 
from django.contrib.auth import authenticate
user = authenticate(username=username, password=password)
user....

Однако, Django автоматически установит его таким образом, обрабатывая некропцию или токенизацию, как бы вы это не назвали, и парсинг в функции authenticate. enter image description here

  • Вопрос: Я хочу сделать то же самое для целочисленного поля, чтобы даже админ не мог видеть это поле, так что оно будет секретным фидом, который может видеть только пользователь.

Вы можете проверить, что user.set_password() делает со значением параметра внутри, и сделать то же самое для рассматриваемого числа. Вы можете сделать это либо в методе модели save(), либо, что предпочтительнее, в методе формы clean_<field>()

# the form where user submits data
class UserForm(forms.ModelForm): # works even with forms.Form

    def clean_secret_number(self):
        """assuming the field name is called `secret_number`"""
        value = self.cleaned_data.get('secret_number')
        if not value:
            # no value got submitted, return early
            return value
        
        # do the same thing which happens in `user.set_password()`
        value = make_password(value)
        # return the hashed value from form
        return value

Обратите внимание, что при отображении формы с существующими данными важно держать поле формы пустым, иначе при отправке формы оно снова будет хэшировать уже хэшированное значение.

Вернуться на верх