alte Frage, aber das Hinzufügen einer deskriptiven Antwort, wie ich es glaube, für einige neue Entwickler nützlich sein würde.
Ich versuchte auch mit self
. base_fields
, aber keine Wirkung: Im Formular wird immer der Datenbankwert angezeigt. Irgendwelche Ideen?
Wenn ein Formular "initialisiert" Form - entweder
mit initial
Argument (. ZB YourModelFrom(initial={'filed1': variable})
— der Regel der Fall, wenn Sie dynamisch berechneten Anfangswerte für einige Felder übergeben möchten) . Referenz Setting Initial Values
oder
mit instance
Argument (zB. YourModelFrom(instance=model_object)
— in der Regel der Fall, wenn man will, eine bestehende Modellinstanz Objekt aktualisieren). Referenzen lesen ModelFrom des save() method
Hinweis:
Klasse erbt `BaseModelFrom` Klasse. Die `BaseModelFrom` Klasse erbt `BaseForm` Klasse.
2 Das Argument instance
wird in `BaseModelFrom` Klassenkonstruktors hinzugefügt, wenn wir ein Modell Klasseninstanz Objekt instance
Argument (daher instance is not None
) dann `BaseModelFrom` Konstruktor ruft model_to_dict()
und Updates initial
Argument zuweisen, bevor Superklasse Konstruktor aufzurufen. Prüfen def __init__
in BaseModelFrom Klasse
Dann Anfangswert auf ein Feld zuweisen explizit (wie im OP der betreffenden Code dargestellt) nicht wirksam, ist dies aufgrund der Art und Weise _clean_fields
Methode in BaseFrom
Klasse geschrieben wird.
-Code Snip:
def _clean_fields(self):
for name, field in self.fields.items():
value = field.widget.value_from_datadict(
self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
initial = self.initial.get(name, field.initial) # <- Check
value = field.clean(value, initial)
else:
Laut Codezeile initial = self.initial.get(name, field.initial)
, wenn Anfangswert für das Feld in initial
dict gegeben wird dann field.initial
zugewiesenen Wert ist nicht verwendet.
[ANTWORT]:
Obwohl @ Daniel Antwort vollkommen richtig ist, aber man kann wie eine andere Art und Weise auch gleiche Wirkung zu erzielen, wird mit self.initial
:
def __init__(self, *args, **kwargs):
super(ArtefactForm, self).__init__(*args, **kwargs)
self.initial['material'] = 'Test'
es versuchen !!
self.initial
ist nichts anderes als das Diktat, das wir in Argument übergeben. Überprüfen Code __init__
in BaseForm
:
class BaseForm(object):
def __init__(........
........):
:
self.prefix = prefix
self.initial = initial or {} # <-- Notice
self.error_class = error_class
:
Hinweis: ich keine Unterlagen gefunden haben im Zusammenhang Anfangs Attribut zu verwenden, ich erforschte nur den Basiscode und verwendet es.
Edit: das Verhalten in Frage berichtet auch in Django Modell dokumentiert
Form.initial
Beachten Sie, dass, wenn ein Field
definiert initial
und Sie umfassen initial
wenn das Formular instanziiert wird, dann letzteres initial
wird Vorrang haben. In diesem Beispiel wird initial
sowohl auf der Feldebene zur Verfügung gestellt und bei der Form Instanzebene, und dieser erhält Vorrang:
>>> from django import forms
>>> class CommentForm(forms.Form):
... name = forms.CharField(initial='class')
... url = forms.URLField()
... comment = forms.CharField()
>>> f = CommentForm(initial={'name': 'instance'}, auto_id=False)
>>> print(f)
<tr><th>Name:</th><td><input type="text" name="name" value="instance" />
<tr><th>Url:</th><td><input type="url" name="url" /></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
PS: Btw, Punkt 2 in meinen Antworten sagen Unterschied zwischen initial
und instance
Argument. Das ist ein weiteres Schlüsselwertargument data
- Werte, die Formvalidierungen auslöst. Lesen Sie diese Difference between Django Form 'initial' and 'bound data'?.
perfekt, danke. – schneck