Django表单动态字段无效但无错误

1 投票
1 回答
1074 浏览
提问于 2025-04-18 16:42

我正在使用一个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是一个字典的列表,字典里的键值对表示表单的第i个字段和我需要的相应项目。
所以生成的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

我真的不明白为什么表单不有效,我在这里卡了好几天,谷歌了很多地方。希望有人能帮帮我。

非常感谢!!!

1 个回答

2

最后,问题解决了。
这个问题发生是因为表单没有绑定,这是我一个粗心的错误造成的:

form = Review_Form(sentences=sents)

而应该是这样的:

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

我分享这个是因为我觉得这对像我一样的新开发者可能会有帮助。
如果你想了解更多关于未绑定和绑定表单的内容,可以从这里阅读:Django表单API

撰写回答