【问题标题】:Django forms, form is always invalidDjango表单,表单总是无效的
【发布时间】:2021-07-26 06:55:33
【问题描述】:

是的,我确实看过其他类似问题的回复。但是我还没有找到对我有帮助的方法,我查看了所有当前可用的解决方案。

我正在尝试在文本框中输入名称,然后点击提交,允许我创建新的项目列表(这些项目无关紧要)。

但是当我点击提交按钮时,什么也没有发生。 经过多次打印语句,我推断原因是因为form.is_valid()函数返回false

if response.method == "POST":
    # returns a dictionary of information in the form
    form = CreateNewList(response.POST)

    print(form.errors)
    # if the form is valid, get the name attribute and create a new ToDoList with it
    if form.is_valid():
        n = form.cleaned_data["name"]
        t = ToDoList(name=n)
        t.save()

        return HttpResponseRedirect("/%i" % t.id)
else:
    form = CreateNewList()

return render(response, "main/create.html", {"form": form})

在阅读了我在网上找到的一些帖子后,我采取的下一步是使用forms.errors 打印出错误 这就是我从打印出来的结果

<ul class="errorlist"><li>check<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

在这一点上,我不知道检查是什么或做什么。网上有人回复说它是某些字典的一部分,我必须做类似form['check'] = 1 的事情,但是当我这样做时,它说字典是不可变的或无效的声明。我也试过form.data['check']=1,同样的事情

这是创建新列表的函数

class CreateNewList(forms.Form):
    name = forms.CharField(label="Name", max_length=200)
    check = forms.BooleanField(label="Completed", required=True)

【问题讨论】:

  • 听起来您的模板中没有包含check 字段?它没有得到它必须拥有的check 字段的True 值,所以它给了你这个错误。确保显示 check 字段并确保它获得 True 值,然后该错误将消失。
  • @markwalker_ 你的解决方案对我有用,然后我删除它只是为了看看会发生什么。然后它继续工作,哈哈。不确定这里到底发生了什么,但我在下面留下了更详细的事件链。非常感谢你

标签: python django forms


【解决方案1】:

我得到了我想要的结果,但我不知道怎么做。以下是事件链:

Dawid Mszanowski 建议我将 required 的值更改为 False 并将 initial 设置为 true 像这样

check = forms.BooleanField(label="Completed", initial=True)

我之前尝试过这个,但我仍然收到错误,没有工作,但我保留了更改

然后我通过在我的用户界面中实现复选框并允许用户手动选中它来实现 MarkWalker 的建议,这实际上确实解决了问题并且我得到了我想要的东西。然后我恢复了 Dawid 建议我所做的所有更改,我的程序仍然按预期运行,所以看起来 Marks 解决方案修复了所有问题。但我不喜欢用户必须手动单击复选框,所以我把它拿掉了。在这一点上,我几乎回到了第 1 格,对吧?我恢复了 Dawid 建议的更改和 Mark 建议的更改。现在由于某种原因我的程序决定工作。不知道发生了什么,但嘿,谢谢大家,我真的很感激

【讨论】:

    【解决方案2】:

    要开始解决此问题,您应该执行以下操作:

    • response.method 替换为request.method。这是因为您希望视图知道请求的内容是什么 方法,而不是响应的。
    • response.POST 替换为request.POST。这是因为您想从之前的 POST 请求中填充数据。

    回到主题,您的布尔字段被标记为必填字段 (required=True),这就是为什么您在未选中相关复选框的情况下无法通过验证的原因。如果您希望默认选中复选框(在第一个 GET 请求时)并且不需要,请使用 initial=True 而不是 required=True

    related question阅读更多内容。

    【讨论】:

    • 响应没有方法,响应也不会传递给视图函数。他只是错误地命名或翻译了视图函数参数,但它不会通过重命名来解决任何问题。
    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    • 2013-09-14
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多