首页 > 解决方案 > 如何标记/加密 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函数。 在此处输入图像描述

标签: django-rest-framework

解决方案


您可以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

请注意,在显示包含现有数据的表单时,将表单的字段保持为空很重要,否则在提交表单时它会再次散列已经散列的值。


推荐阅读