Django 模型表单没有 POST 数据



我在Stack Overflow上看到了与此类似但非常不同的问题,所以请不要那么快投票关闭。从本质上讲,我一直在尝试按照我在每个在线教程中找到的技术制作一个非常简单的登录表单。出于某种原因,填写和提交表单不会返回任何 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 类,由于某种原因,在提交完成的表单时,没有返回 POST 数据,因此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并手动列出用户名和密码字段。不应将模型附加到窗体以避免此错误。这可能是最新版本中的新功能,因为我从未见过它。

最新更新