Django 模型表单编号 POST 数据

Django Model Form No POST Data

我在 Stack Overflow 上看到过与此类似但又非常不同的其他问题,因此请不要那么快投票结束。本质上,我一直在尝试按照我在每个在线教程中找到的技术制作一个非常简单的登录表单。出于某种原因,填写并提交表格不会 return 任何 POST 请求数据。这是我的代码:

查看

def signon(request):

    if request.method == 'POST':

        form = SignOnForm(request.POST)

        if form.is_valid():

            username = form.cleaned_data['username']
            password = form.cleaned_data['password']

            user = authenticate(username = username, password = password)

            logger.info(user)

            return HttpResponse('Username: {} Password {}'.format(username, password))

        return HttpResponse("Error {}".format(request.POST))

    if request.method == 'GET':

        form = SignOnForm()

        return render(request, 'signon.html', {'form': form})

模板

<!DOCTYPE html>
<html lang = "en">

    <head>
        <meta charset = "UTF-8">
        <title>Sign into Account</title>
    </head>

    <body>

        <form method = "POST">
            {% csrf_token %}
            {{ form }}
            <input type = "submit" value = "Sign In">
        </form>

    </body>

</html>

表格

class SignOnForm(forms.ModelForm):

    password = forms.CharField(widget = forms.PasswordInput)

    class Meta:

        model = User

        fields = ['username', 'password']

我正在使用 Django 提供的 User class,由于某种原因,在提交完成的表单后,没有 POST 数据被 returned,因此为什么 is_valid 总是失败。有什么想法吗?

尝试像这样编辑您的视图,

def signin(request):
    if request.method == 'POST':
        form = SignOnForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('url of some page')
            return HttpResponse("Error {}".format(form.errors)
    else:
        form = SignOnForm()
    return render(request, 'signon.html', dict(form=form))

我想我已经发现了这个问题。模型表单希望在完成后保留数据。因此,此表单未能成功尝试使用现有用户名创建重复用户,这就是它面临的错误。

解决方案是什么?继承自 forms.Form 而不是 forms.ModelForm 并手动列出用户名和密码字段。您不应将模型附加到您的表单以避免此错误。这可能是最新版本中的新功能,因为我从未见过它。