【问题标题】:Password not saving when creating user创建用户时密码不保存
【发布时间】:2020-04-14 18:06:41
【问题描述】:

我知道有数百篇关于该主题的帖子,但在所有这些帖子中,都与我自己的程序略有不同,我无法将其适应我的程序,因为 Django 处理密码的方式是如此混乱我什么都不懂。非常感谢您的帮助,我提前感谢您。

因此,当新用户注册时,一切正常,但不知何故,密码并未保存在数据库中。进入admin界面,提示密码格式无效或者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.

有人可以帮帮我吗?

提前致谢!

【问题讨论】:

  • 你应该使用create_user函数来创建用户docs.djangoproject.com/en/3.0/topics/auth/default/…
  • 是的,我知道这是推荐的方法,但我认为密码问题与我创建用户的方式无关,因为我看到很多人使用create_user 和密码还是有问题。
  • 使用 set_password() 保存密码,否则它会将密码保存为普通文本。我认为这是你的错误。
  • 是的,问题解决了,谢谢,祝你有美好的一天!

标签: django django-forms passwords django-users


【解决方案1】:

您必须使用 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})

【讨论】:

  • 这解决了问题谢谢你,祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多