Nehmen Sie zum Beispiel diese sehr einfache Form:
class SearchForm(Form):
q = forms.CharField(label='search')
Dies wird in der Vorlage gerendert:
<input type="text" name="q" id="id_q" />
Ich möchte placeholder
diesem Feld jedoch das Attribut mit dem Wert hinzufügen Search
, damit der HTML-Code ungefähr so aussieht:
<input type="text" name="q" id="id_q" placeholder="Search" />
Am besten möchte ich den Platzhalterwert CharField
in der Formularklasse über ein Wörterbuch oder so etwas weitergeben:
q = forms.CharField(label='search', placeholder='Search')
Was wäre der beste Weg, um dies zu erreichen?
python
django
django-forms
Joelbitar
quelle
quelle
forms.TextInput
, um dieattrs={'placeholder': 'Search'}
Deklaration durchzuführen?Für eine ModelForm können Sie die Meta-Klasse folgendermaßen verwenden:
quelle
Die anderen Methoden sind alle gut. Wenn Sie das Feld jedoch nicht angeben möchten (z. B. für eine dynamische Methode), können Sie Folgendes verwenden:
Außerdem kann der Platzhalter für ModelForms mit der angegebenen Instanz von der Instanz abhängen.
quelle
ModelMultipleChoiceField
. Vielen Dank!for f in MyCommentForm.base_fields.values(): f.widget.attrs["placeholder"] = f.label
, aber ich mag deine Konstruktormethode besser.Mit diesem Code können Sie Platzhalter attr für jedes TextInput-Feld in Ihrem Formular hinzufügen. Text für Platzhalter wird aus Modellfeldbezeichnungen entnommen.
quelle
Gute Frage. Ich kenne drei Lösungen:
Lösung Nr. 1
Ersetzen Sie das Standard-Widget.
Lösung Nr. 2
Passen Sie das Standard-Widget an. Wenn Sie dasselbe Widget verwenden, das das Feld normalerweise verwendet, können Sie dieses einfach anpassen, anstatt ein völlig neues zu instanziieren.
Lösung Nr. 3
Wenn Sie mit einem Modellformular arbeiten, haben Sie ( zusätzlich zu den beiden vorherigen Lösungen ) die Möglichkeit, ein benutzerdefiniertes Widget für ein Feld anzugeben, indem Sie das
widgets
Attribut der innerenMeta
Klasse festlegen .quelle
self.fields
for field_name in self.fields: self.fields[field_name].widget.attrs.update({"placeholder": sth})
Es ist unerwünscht, wissen zu müssen, wie ein Widget instanziiert wird, wenn Sie nur seinen Platzhalter überschreiben möchten.
quelle
Meistens möchte ich nur, dass alle Platzhalter dem ausführlichen Namen des in meinen Modellen definierten Felds entsprechen
Ich habe ein Mixin hinzugefügt, um dies einfach zu jeder Form zu machen, die ich erstelle.
Und
quelle
Nachdem ich mir Ihre Methode angesehen hatte, benutzte ich diese Methode, um sie zu lösen.
quelle