【问题标题】:Saving Hashed Version of User Password in Django Form Not Working以 Django 表单保存用户密码的散列版本不起作用
【发布时间】:2014-09-30 04:26:03
【问题描述】:

我一直在尝试保存用户密码的散列版本,但它不起作用。

forms.py

class up_form(forms.ModelForm):
    class Meta:
        model = Users
        fields =['email', 'password', 'username', 'status']

views.py

from myapp.forms import up_form
from django.contrib.auth.hashers import make_password
def register(request):
    if request.method == 'POST':
        sign_up = up_form(request.POST or None)
        if sign_up.is_valid():
            sign_up.password = make_password(sign_up.cleaned_data['password'])
            sign_up = sign_up.save(commit = False)
            sign_up.status = 1
            sign_up.save()

但我的password 仍然以纯文本格式保存。我该如何解决这个问题?

【问题讨论】:

    标签: python django django-forms django-views


    【解决方案1】:

    您需要切换语句的顺序,因为您已将对象命名为与表单本身相同的名称。

    if request.method == 'POST':
        sign_up = up_form(request.POST)
        if sign_up.is_valid():
            sign_up = sign_up.save(commit = False)
            sign_up.password = make_password(sign_up.cleaned_data['password'])
    

    我希望您也从该方法返回响应,并在 POST 请求之后适当地重定向用户。

    考虑这个版本:

    def register(request):
        form = up_form(request.POST or None)
        if form.is_valid():
            sign_up = form.save(commit=False)
            sign_up.password = make_password(form.cleaned_data['password'])
            sign_up.status = 1
            sign_up.save()
            return redirect('/thank-you/')
        return render(request, 'sign_up_form.html', {'form': form})
    

    【讨论】:

    • 返回AttributeError at /myapp/register/ 'Users' object has no attribute 'cleaned_data'
    • 抱歉,现在就试试吧。
    【解决方案2】:

    最好的方法是遵循 Django 的原始 UserCreationForm 所做的并覆盖表单的 save 方法:

    class UpForm(forms.ModelForm):
        class Meta:
            model = Users
            fields =['email', 'password', 'username', 'status']
    
        def save(self, commit=True):
            user = super(UpForm, self).save(commit=False)
            user.set_password(self.cleaned_data["password"])
            if commit:
                user.save()
            return user
    

    这样您就不必在使用表单的每个视图中都make_password()

    【讨论】:

    • 为什么不只是子类 UserCreationForm?
    • OP 没有说他正在创建用户。我只是建议将处理留给表单类,而不是在视图中嵌套 if 语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 2017-05-10
    相关资源
    最近更新 更多