我有一个项目,人们可以为表单创建变量,然后其他用户将填写该表单。当他们创建所述表单时,他们可以选择3种不同类型的答案:从值列表,整数或字符串。基本上,我创建了一个用户为此表单创建的所有变量的formset,但如果它是一个列表,我想将输入的类型从CharField更改为ChoiceField。
这是我的视图:
def insererDonnee(request, modele, contexte=-1):
variables = Variable.objects.filter(modele=modele)
varIter = variables.iterator()
DonneeFormSet = formset_factory(InsertDonneeForm, extra=variables.count())
submitAdress = "insererDonnee"
if request.POST:
formset = DonneeFormSet(request.POST)
else:
formset = DonneeFormSet()
for formx in formset:
formx.variable = varIter.next()
formx.nomVar = formx.variable.nom
formx.fields['valeur'].label = formx.nomVar
# Here I call setList to change the type
if formx.variable.type_variable in ["SOLIST", "LIST"]:
formx.setList(formx.variable)
我的表格:
class InsertDonneeForm(forms.Form):
variable = Variable()
nomVar = 'Variable'
valeur = forms.CharField(label=nomVar, max_length=100)
def setList(self, variable):
choices = ListItem.objects.filter(variable=variable, modele=variable.modele)
valeur = forms.ModelChoiceField(queryset=choices)# or None)
print valeur
最后一次打印只是为了查看该字段是否确实已更改,但是如果我在调用setList后在我的视图中执行相同的打印,则我的字段仍为
无论如何我可以在创建表单后选择合适的类型吗?
答案 0 :(得分:0)
找到解决方案。方法setList现在返回新的Choice字段,而不是直接在表单中更改字段:
def setList(self, variable):
choices = ListItem.objects.filter(variable=variable, modele=variable.modele)
valeur = forms.ModelChoiceField(queryset=choices)
return valeur
然后在视图中,我只需要将新创建的字段分配给我想要更改的旧字段:
if formx.variable.type_variable in ["SOLIST", "LIST"]:
formx.fields['valeur']= formx.setList(formx.variable)