创建新帐户时 Django 密码未进行哈希处理

use*_*206 2 python django

我是 django 的新手,我试图找出为什么通过我的帐户表单创建新帐户不会对密码进行哈希处理(我假设密码没有进行哈希处理,因为在创建帐户时我无法使用密码登录,并且此消息显示在通过表单创建的帐户的 django 管理的密码字段下:)Invalid password format or unknown hashing algorithm。我可以在 django 管理中成功创建不存在此未哈希密码问题的新帐户。

视图.py:

@unauthenticated_user
def create_account(request):
    form = AccountForm()

    if request.method == 'POST':
        form = AccountForm(request.POST)
        # should hash the password, check username/email doesnt already exist, etc
        if form.is_valid():
            user = form.save()
            return redirect('/login')
        else:
            messages.info(request, "Count not create account.")

    context = {'form': form}
    return render(request, 'accounts/create_account.html', context)
Run Code Online (Sandbox Code Playgroud)

模型.py:

class Account(AbstractUser):

    def __str__(self) -> str:
        return self.first_name

    pass
Run Code Online (Sandbox Code Playgroud)

创建帐户表格:

<form action="{% url 'create_account' %}" method="POST">
    {% csrf_token %}
    {{form.as_p}}
    <input type="submit" name="submit">
</form>
Run Code Online (Sandbox Code Playgroud)

表格:

class AccountForm(ModelForm):
    class Meta:
        model = Account  # which model we're building a form for
        # password not hashed and requires username even if username omitted from fields
        fields = ['email', 'password', 'first_name', 'last_name', 'username']
Run Code Online (Sandbox Code Playgroud)

我正在关注一个教程系列,其中与我的代码的唯一区别是我从AbstractUser模型中扩展了Account类(这样我就可以将创建用户表单更改为仅需要电子邮件和密码而不是用户名和密码)。除非我错了,否则我认为该AbstractUser模型应该自动为您散列密码。

我这里哪里出错了?

JPG*_*JPG 5

正如@purple提到的,使用set_password(...)--Doc方法作为

@unauthenticated_user
def create_account(request):
    form = AccountForm()

    if request.method == 'POST':
        form = AccountForm(request.POST)
        
        if form.is_valid():
            user = form.save(commit=False)  # set `commit=False`
            user.set_password(
                form.cleaned_data["password"]
            )  # call `set_password(...)` with "raw password"
            user.save()  # save the actual User instance
            return redirect('/login')
        else:
            messages.info(request, "Count not create account.")

    context = {'form': form}
    return render(request, 'accounts/create_account.html', context)
Run Code Online (Sandbox Code Playgroud)