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

Python 多表单验证中的表单验证错误,python,django,forms,Python,Django,Forms,当我提交多张表格时,我收到了带有前缀数据的帖子: [(u'2-response_-vote',u'3'),(u'3-response_-text',u'test text'),(u'1-response_-text',u'test text',u'6-response_-vote',u'test text'),(u'4-response_-vote',u'2'),(u'2-response_-text',u'test text 3'),(u'7-response_-radio',u'2'),(u

当我提交多张表格时,我收到了带有前缀数据的帖子:

[(u'2-response_-vote',u'3'),(u'3-response_-text',u'test text'),(u'1-response_-text',u'test text',u'6-response_-vote',u'test text'),(u'4-response_-vote',u'2'),(u'2-response_-text',u'test text 3'),(u'7-response_-radio',u'2'),(u'RfkMiddlewareToken u',u'ShznsNGSDD3WumFvgt'),(u',(u'5-回应(u'2')]

这是我的模型:

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,无法使用):


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

form(field_value, instance=response)

这是我绝对不理解的。请有人解释一下为什么完整的实例不足以完成表单吗?

我不太清楚,但在我看来,问题在于你如何使用“实例”表单创建中的参数。我认为实例必须是数据库中的现有对象,此参数旨在通过表单编辑现有对象,防止创建新对象。我认为您应该对代码进行重构,您无需创建实例,只需将所有字段值直接传递给表单。类似于:

form(field_value)

为什么不使用表单集?尝试使用表单(问题=问题,**字段\值)而不是表单(实例=响应)@DanielRoseman我还不知道如何使用它!文档非常有用。据我所知,它完全符合您的需要,没有任何前缀的改动。@DanielRoseman文档确实很有帮助,但我恐怕我不能在我的用例中使用表单集,因为我使用了一种特殊的方法来创建一个适合的模板m取决于每个家长的问题。我编辑我的第一条消息以添加此功能。非常感谢您的建议。实际上,我需要先创建一个实例,因为问题必须绑定到响应对象。实例化响应=响应(问题=问题)请允许我以静默方式填写response.question\u id和question字段。如果我添加字段值['question':question),它失败了,出现了一个无法识别的类型错误。我很高兴看到您将如何重构它。这是在一个地方很难修复某些东西来梳理您的代码。我唯一能提出的一点是,不要假设所有的代码重写都是在表单验证后将响应对象绑定到问题实例,因为您的表单无论如何都不会验证它。
form(field_value)