2017-12-01 3 views
0

Ich fühle mich wie ich einige sehr grundlegende Punkt fehlt, kann aber das nicht lösen.
Lassen Sie uns sagen, ich habe Modell wie dieses:Hinzufügen und initialisieren benutzerdefiniertes Feld in Django ModelForm

class Person(models.Model): 
    first_name = models.CharField(max_length=256, blank=True) 
    # this is weird field, but needed for my usecase 
    last_name = models.WeirdCustomField(max_length=256, blank=True) 

Und es ist eine Form für das, was Ich mag würde ein bisschen (Kommentare) anzupassen:

class PersonForm(forms.ModelForm): 

    class Meta: 
     model = Address 
     # I want to override 'last_name' field, so exclude it here 
     exclude = ['last_name'] 

    # And add additional field 
    my_field = ChoiceField(choices=list_of_choicec) 
    last_name = forms.CharField() 

    def __init__(self, *args, **kwargs): 
     last_name = kwargs.pop('last_name', None) 
     my_field = kwargs.pop('my_field', None) 
     super(PersonForm, self).__init__(*args, **kwargs) 
     self.fields['last_name'] = last_name 
     self.fields['my_field'] = my_field 

Jetzt in der shell, (nach allen Importen ...)

person = Person.objects.get(first_name='Jacob') 
person.first_name # Prints 'Jacob', correct! 
form = PersonForm(instance=person, last_name='Smith', my_field='test123') 
form['first_name'].value() # -> 'Jacob', that's right 
form['last_name'].value() # -> nothing, I expected 'Smith' 
form['my_field'].value() # -> nothing, I would like to see 'test123' 

Ich denke, ich graben Internet sehr tief, aber konnte keine Lösungen für diese Art von Problem finden.

Antwort

1

Sie müssen den Anfangswert festlegen. Ersetzen Sie in Ihrer Init mit unterem Code.

self.fields['last_name'].initial = last_name 
self.fields['my_field'].initial = my_field 

Die Initiale kann auch übergeben werden, wenn die Formularinstanz erstellt wird.

form = PersonForm(instance=person, initial={'last_name'='Smith', 'my_field'='test123'}) 

Dieser ist der empfohlene Weg, es zu tun. Sie müssen die init-Methode nicht überschreiben.

+0

Erstaunlich, ich glaube nicht, dass ich es in naher Zukunft selbst herausfinden würde, danke! Ich muss auch sagen, es ist ziemlich kontra intuitiv, aber ich denke, es ist der Rahmen Weg. –

+0

versuchen Sie, self.fields ['my_field'] in Ihrem init zu drucken. Sie können sehen, was es ist. –

Verwandte Themen