创建用户时不保存密码
Password not saving when creating user
我知道有数百篇关于该主题的帖子,但在所有这些帖子中,都与我自己的程序略有不同,我无法将其适应我的程序,因为 Django 处理密码的方式是这样的一团糟,我什么都不懂。如果能提供一点帮助,我将不胜感激,在此先感谢您。
因此,当新用户注册时,一切正常,但不知何故,密码未保存在数据库中。当我进入管理界面时,它告诉我密码格式无效或 hashag 函数未知。
这是我的代码:
Forms.py
class InscriptionForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', 'email', 'password']
widgets = {'username': forms.TextInput(attrs={'class': 'form-control'}),
'first_name': forms.TextInput(attrs={'class': 'form-control'}),
'last_name': forms.TextInput(attrs={'class': 'form-control'}),
'email': forms.EmailInput(attrs={'class': 'form-control'}),
'password': forms.PasswordInput(attrs={'class': 'form-control'})}
def clean_password(self):
password = self.cleaned_data['password']
try:
validate_password(password, user=self)
except forms.ValidationError:
self.add_error('password', password_validators_help_texts())
return password
Views.py
def inscription(request):
if request.method == "POST":
form = InscriptionForm(request.POST)
if form.is_valid():
new_user = form.save()
authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'],)
login(request, new_user)
request.session['is_connected'] = True
return redirect(inscription_suite)
else:
form = InscriptionForm()
return render(request, 'inscription/inscription.html', {'form': form})
我已经试过像这样修改视图:
def inscription(request):
if request.method == "POST":
form = InscriptionForm(request.POST)
if form.is_valid():
new_user = form.save(commit=False)
new_user.password = make_password(form.cleaned_data['password'])
authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'],)
login(request, new_user)
new_user.save()
request.session['is_connected'] = True
return redirect(inscription_suite)
else:
form = InscriptionForm()
return render(request, 'inscription/inscription.html', {'form': form})
但它引发了以下错误ValueError at /inscription
Cannot force an update in save() with no primary key.
有人可以帮我吗?
提前致谢!
您必须使用 set_password() 保存密码。
def inscription(request):
if request.method == "POST":
form = InscriptionForm(request.POST)
if form.is_valid():
new_user = form.save(commit=False)
password = form.cleaned_data['password'] # get password
new_user.set_password(password) # set the password
new_user.save() # save the user
authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'],)
login(request, new_user)
request.session['is_connected'] = True
return redirect(inscription_suite)
else:
form = InscriptionForm()
return render(request, 'inscription/inscription.html', {'form': form})
我知道有数百篇关于该主题的帖子,但在所有这些帖子中,都与我自己的程序略有不同,我无法将其适应我的程序,因为 Django 处理密码的方式是这样的一团糟,我什么都不懂。如果能提供一点帮助,我将不胜感激,在此先感谢您。
因此,当新用户注册时,一切正常,但不知何故,密码未保存在数据库中。当我进入管理界面时,它告诉我密码格式无效或 hashag 函数未知。
这是我的代码:
Forms.py
class InscriptionForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', 'email', 'password']
widgets = {'username': forms.TextInput(attrs={'class': 'form-control'}),
'first_name': forms.TextInput(attrs={'class': 'form-control'}),
'last_name': forms.TextInput(attrs={'class': 'form-control'}),
'email': forms.EmailInput(attrs={'class': 'form-control'}),
'password': forms.PasswordInput(attrs={'class': 'form-control'})}
def clean_password(self):
password = self.cleaned_data['password']
try:
validate_password(password, user=self)
except forms.ValidationError:
self.add_error('password', password_validators_help_texts())
return password
Views.py
def inscription(request):
if request.method == "POST":
form = InscriptionForm(request.POST)
if form.is_valid():
new_user = form.save()
authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'],)
login(request, new_user)
request.session['is_connected'] = True
return redirect(inscription_suite)
else:
form = InscriptionForm()
return render(request, 'inscription/inscription.html', {'form': form})
我已经试过像这样修改视图:
def inscription(request):
if request.method == "POST":
form = InscriptionForm(request.POST)
if form.is_valid():
new_user = form.save(commit=False)
new_user.password = make_password(form.cleaned_data['password'])
authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'],)
login(request, new_user)
new_user.save()
request.session['is_connected'] = True
return redirect(inscription_suite)
else:
form = InscriptionForm()
return render(request, 'inscription/inscription.html', {'form': form})
但它引发了以下错误ValueError at /inscription
Cannot force an update in save() with no primary key.
有人可以帮我吗?
提前致谢!
您必须使用 set_password() 保存密码。
def inscription(request):
if request.method == "POST":
form = InscriptionForm(request.POST)
if form.is_valid():
new_user = form.save(commit=False)
password = form.cleaned_data['password'] # get password
new_user.set_password(password) # set the password
new_user.save() # save the user
authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'],)
login(request, new_user)
request.session['is_connected'] = True
return redirect(inscription_suite)
else:
form = InscriptionForm()
return render(request, 'inscription/inscription.html', {'form': form})