当我提交多个表单时,我收到带有前缀数据的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
答案 0 :(得分:0)
据我所知,将表单与实例绑定是不够的。 form方法is_bound返回true但表单仍然无效:is_valid()返回False。对我来说,解决方案是在实例之外添加字典。
form(field_value, instance=response)
这一点我绝对不明白。愿有人能够解释为什么完整的实例不足以完成表格吗?
答案 1 :(得分:0)
完全不知道,但在我看来,问题在于你如何使用&#34;实例&#34;表单创建中的参数。我认为实例必须是来自数据库的现有对象,该参数旨在通过表单编辑现有对象,防止创建新对象。我认为你应该对你的代码进行一些重构,你不需要创建实例,只需直接传递所有字段值即可。类似的东西:
form(field_value)