Python 在Django表单中保存用户密码的哈希版本无效
我一直在尝试保存用户密码的哈希版本,但它不起作用 forms.py: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
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语句。