在 Django 中注册新用户的问题

Issue signing up new users in Django

我在使用 Django 1.11 的应用程序中有以下注册流程-

accounts/views.py:

from .forms import UserForm

def sign_up(request):
    if request.method == "POST":
        form = UserForm(request.POST)
        if form.is_valid():
            user = form.save()
            return redirect('index')
    else:
        form = UserForm()
    return render(request, 'signup.html', {'form': form})

accounts/forms.py:

from django.forms import ModelForm
from django.contrib.auth.models import User

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'password']

对于 "register" 新用户来说确实如此,因为它在数据库中创建了一个新用户。问题是我无法使用新创建的用户登录,username/pw 组合不匹配。进入数据库我看到新创建的用户,但密码是纯文本的:"password"。但是我通过命令行创建的第一个用户 python manage.py createsuperuser 有一个像 pasdfhjasf8234jk324hgsdfa8df89asdf987 这样的加盐哈希作为密码,我可以使用我为它创建的密码正确登录,即 "password".

如何在 Django 知道将密码正确存储为加盐哈希的情况下使用我的 ModelForm 保存新用户?

您可以通过ModelForm中的样板代码设置密码,您需要使用.set_password(..) [Django-doc]来散列密码:

class UserForm(ModelForm):

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'password']

    def save(self, commit=True):
        user = super().save(commit=False)
        user.<b>set_password(self.cleaned_data['password'])</b>
        if commit:
            user.save()
        return user

然而,Django 已经有一个 UserCreationForm [Django-doc] 实现了这一点。它将使用两个表单字段来验证用户是否输入了两次相同的密码。因此,我们可以将 UserCreationForm:

子类化
from django.contrib.auth.forms import <b>UserCreationForm</b>

class UserForm(<b>UserCreationForm</b>):

    class Meta:
        model = User
        <b>fields = ['first_name', 'last_name', 'username', 'email']</b>