在Django视图中更改字段类型

时间:2017-06-17 19:45:37

标签: python django forms django-views

我有一个项目,人们可以为表单创建变量,然后其他用户将填写该表单。当他们创建所述表单时,他们可以选择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后在我的视图中执行相同的打印,则我的字段仍为

无论如何我可以在创建表单后选择合适的类型吗?

1 个答案:

答案 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)