【问题标题】:Django Model Form No POST DataDjango 模型表单没有 POST 数据
【发布时间】:2017-06-09 14:27:04
【问题描述】:

我在 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 总是失败。有什么想法吗?

【问题讨论】:

  • 您在表单模板中的操作在哪里?
  • 我尝试使用动作"/signon/",但它没有做任何事情
  • 好吧,我尝试了您的代码,并且正确接收了 POST 数据。并且is_valid 不会失败
  • 所以您在响应中获得了包含用户名和密码的页面?
  • 是的。这是正确的。它向你展示了什么? return HttpResponse("Error {}".format(request.POST)) 显示了什么?

标签: python django django-forms django-users


【解决方案1】:

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

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))

【讨论】:

  • 同样,如果表单无效,则条件下的语句无关紧要。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2016-08-11
    • 2012-12-22
    • 2015-03-11
    相关资源
    最近更新 更多