【发布时间】: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 开发方面不是很有经验,你能详细说明一下吗?