2017-06-17 5 views
0

Ich habe ein Projekt, in dem Personen Variablen für ein Formular erstellen können und andere Benutzer dieses Formular ausfüllen. Wenn sie das genannte Formular erstellen, können sie die Antwort aus drei verschiedenen Typen auswählen: aus einer Werteliste, einer Ganzzahl oder einer Zeichenfolge. Grundsätzlich erstelle ich ein Formset aller Variablen, die der Benutzer für dieses Formular erstellt hat, aber wenn es sich um eine Liste handelt, möchte ich den Typ der Eingabe von einem CharField in ein ChoiceField ändern.Ändern des Feldtyps in einer Django-Ansicht

Also das ist meine Ansicht ist:

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) 

Und meine Form:

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 

Der letzte Druck war nur um zu sehen, ob das Feld tatsächlich geändert wurde, was es ist, aber wenn ich nach dem Aufruf von setList den gleichen Druck in meiner Ansicht mache, sind meine Felder immer noch

Kann ich sowieso den passenden Typ nach dem Erstellen des Formulars wählen?

Antwort

0

Die Lösung gefunden. Das Verfahren Setlist, statt das Feld direkt in Form ändert, kehrt nun das neue Auswahlfeld:

def setList(self, variable): 
    choices = ListItem.objects.filter(variable=variable, modele=variable.modele) 
    valeur = forms.ModelChoiceField(queryset=choices) 
    return valeur 

Und dann in der Ansicht, ich habe gerade das neu erstellte Feld zur alten Feld möchte ich zuweisen müssen, um Änderung:

if formx.variable.type_variable in ["SOLIST", "LIST"]: 
    formx.fields['valeur']= formx.setList(formx.variable) 
Verwandte Themen