Python 在Django表单中保存用户密码的哈希版本无效

Python 在Django表单中保存用户密码的哈希版本无效,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,我一直在尝试保存用户密码的哈希版本,但它不起作用 forms.py: class up_form(forms.ModelForm): class Meta: model = Users fields =['email', 'password', 'username', 'status'] from myapp.forms import up_form from django.contrib.auth.hashers import make_passwor

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

forms.py

class up_form(forms.ModelForm):
    class Meta:
        model = Users
        fields =['email', 'password', 'username', 'status']
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()
视图.py

class up_form(forms.ModelForm):
    class Meta:
        model = Users
        fields =['email', 'password', 'username', 'status']
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()

但是我的
密码
仍然以纯文本形式保存。如何解决这个问题?

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

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})

最好的方法是按照Django的原版操作,重写表单的
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()

这将返回
AttributeError at/myapp/register/“Users”对象没有属性“cleaned_data”
。很抱歉,现在就试试。为什么不只是将UserCreationForm子类化呢?OP没有说他正在创建一个用户。我只是建议将处理留给form类,而不是在视图中嵌套if语句。