多表单验证中的表单验证错误

时间:2014-11-15 14:25:10

标签: python django forms

当我提交多个表单时,我收到带有前缀数据的POST:

  

[(u'2-response_vote',u'3'),(u'3-response_text',u'test text'),(u'1-response_text',u'test text 3'),( u'6-response_text',u'test text'),(u'5-response_text',u'test text'),(u'4-response_vote',u'2'),(u'2-response_text' ,u'test text 3'),(u'7-response_radio',u'2'),(u'csrfmiddlewaretoken',u'sHFFh7NGSdD3bMwU57ZScifMJ9KKvvGT'),(u'5-response_vote',u'2')] < / p>

这是我的模特:

class Response(models.Model):
    question = models.ForeignKey(Question)
    user = models.ForeignKey(SampleGroup, null=True, blank=True, default=None)
    response_radio = models.NullBooleanField()
    response_vote = models.IntegerField(help_text="Choisir une valeur entre 1 et 5", default=None, blank=True, null=True)
    response_text = models.TextField(default=None, blank=True)

所以,在我的CBV中,我必须处理这个POST数据并尝试这种方法:

def post(self, *args, **kwargs):
    forms = set()
    fields_values = {}
    for k, value in self.request.POST.items():
        if 'response' in k:
            i, field = k.split('-')
            data[i][field] = value # use of defaultdic from collections

    for i, field_value in fields_values.items():
        question = Question.objects.get(pk=i)
        response = Response(question=question, **field_value)
        form = get_response_form(question)
        form = form(instance=response)

        if not form.is_valid():
            return self.form_invalid()
        forms.add(form)

我一直有错误:

  

表格无效

表单已绑定但无效。有人可以解释原因吗?

修改 这是一个特殊的函数,它返回一个适应的形式(可能就我所知的formset,无法使用它们):

QUESTION_TYPE = {
'boolean': ['response_radio'],
'vote': ['response_vote'],
'vote_and_text': ['response_vote', 'response_text'],
'close_and_text': ['response_radio', 'response_text'],
'text': ['response_text'],
}

def get_response_form(question):
    "Returns an appropriate form"

    field_list = QUESTION_TYPE[question.question_type]

    class AdaptedResponseForm(ModelForm):

        def __init__(self, *args, **kwargs):
            super(AdaptedResponseForm, self).__init__(*args, **kwargs)
            self.helper = FormHelper()
            self.helper.form_tag = False
            self.helper.form_show_labels =  False
            self.helper.layout = Layout(
                Fieldset(
                    question.question_text,
                )
            )

        class Meta:
            model = Response
            fields = field_list

    return AdaptedResponseForm

2 个答案:

答案 0 :(得分:0)

据我所知,将表单与实例绑定是不够的。 form方法is_bound返回true但表单仍然无效:is_valid()返回False。对我来说,解决方案是在实例之外添加字典。

form(field_value, instance=response)

这一点我绝对不明白。愿有人能够解释为什么完整的实例不足以完成表格吗?

答案 1 :(得分:0)

完全不知道,但在我看来,问题在于你如何使用&#34;实例&#34;表单创建中的参数。我认为实例必须是来自数据库的现有对象,该参数旨在通过表单编辑现有对象,防止创建新对象。我认为你应该对你的代码进行一些重构,你不需要创建实例,只需直接传递所有字段值即可。类似的东西:

form(field_value)