【问题标题】:Django form with Dynamic fields. Invalid but no errors带有动态字段的 Django 表单。无效但没有错误
【发布时间】:2014-08-10 00:23:26
【问题描述】:

我一直在使用一个Django表单,它可以根据传入的参数动态生成多个字段,正如我从SO那里学到的那样:

 class Review_Form(forms.Form):
    def __init__(self, *args, **kwargs):
        sentences = kwargs.pop('sentences')
        super(Review_Form, self).__init__(*args, **kwargs)
        counter = 1
        for q in sentences:
             self.fields['review' + str(counter)] = forms.CharField(label='Review' + str(counter), required=False)
             counter += 1

对于对应的html,我将每个字段分别传入contest['block'],其中block是一个字典列表,键值对表示表单的ith字段和我需要的对应项。
所以html如下:

<form action="{% url 'done_review' title%}" method="post">
            <div class="container">
                <div class="row">
                    {% for b in block %}
                    <div class="8u">
                        <p> {{b.sent}} </p>
                    </div>
                    <div class="4u">
                        <input class="front_form-control" value="{{b.text}}" type={{b.field}}
                    </div>
                </div>
                {% csrf_token %}
                {% endfor %}
            </div>
            <div class="container">
                <div class="row">
                    <div class="12u">
                        <button class="btn btn-lg btn-info" type="submit" value="Submit">Done Review
                        </button>
                    </div>
                </div>
            </div>
            {% csrf_token %}
</form>

然后,很遗憾,我提交后表单无效。我尝试通过在views.py 中打印错误来测试它,如下所示:

if form.is_valid():
     # do something
else:
     print form.errors, 'here1'
     print form.non_field_errors(), 'here2'
     field_errors = [(field.label, field.errors) for field in form]
     print field_errors, 'here3' 

打印出来是这样的:

  here1
  here2
 [('Review1', []), ('Review2', []), ...many more... ('Review38', [])] here3

我真的不明白为什么该表格无效,我被困在这里好几天了,到处搜索。希望有人可以在这里帮助我。

非常感谢!!!

【问题讨论】:

  • form.errors 仅在调用 form.is_valid() 后才会填充。你有required=False,并且没有使用任何验证器。您希望表单做什么。
  • 我希望在用户填写一些(或不填写)字段并单击提交后,我可以得到用户填写的内容。我设置required=False 允许表单的某些字段不要填写,我不使用验证器,因为我只需要用户填写的任何内容作为字符串。我不确定我是否以正确的方式这样做..
  • 如果你动态创建属性,尝试动态检查它们,你可以重写表单清理函数并检查它们:stackoverflow.com/questions/2432489/…
  • 谢谢@levi 但我真的不明白如何检查它们。正如您链接的最后一个答案所说,当表单无效时,我无法访问 clean_data 。所以,很抱歉我在 django 开发方面不是很有经验,你能详细说明一下吗?

标签: python html django forms


【解决方案1】:

终于,问题解决了。
发生这种情况是因为表单未绑定,因为我的一个粗心错误:

form = Review_Form(sentences=sents)

而不是它应该是什么:

form = Review_Form(request.POST, sentences=sents)

我之所以回答这个问题,是因为我认为这可能对像我这样的其他新开发人员有用。
如果您愿意,可以从此处阅读更多关于未绑定和绑定表单的信息:Django form API

【讨论】:

  • 你还有另一个问题,你有多个{% csrf_token %} 实例,因为你把这个标签放在你的for循环中。您需要在&lt;form&gt; 标记之后或&lt;/form&gt; 标记之前添加此标记。现在,如果您有 10 个字段,那么您将有 11 个 {% csrf_token %} 实例
猜你喜欢
  • 2012-04-12
  • 2013-10-14
  • 1970-01-01
  • 2011-07-27
  • 2011-08-28
  • 2016-04-25
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
相关资源
最近更新 更多