Ändern Sie die Breite von Formularelementen, die mit ModelForm in Django erstellt wurden
Lesezeit: 4 Minuten
Josh Jagd
Wie kann ich die Breite eines Textarea-Formularelements ändern, wenn ich es mit ModelForm erstellt habe?
Hier ist meine Produktklasse:
class ProductForm(ModelForm):
long_desc = forms.CharField(widget=forms.Textarea)
short_desc = forms.CharField(widget=forms.Textarea)
class Meta:
model = Product
Und der Vorlagencode …
{% for f in form %}
{{ f.name }}:{{ f }}
{% endfor %}
f ist das eigentliche Formularelement…
zuber
Der einfachste Weg für Ihren Anwendungsfall ist die Verwendung von CSS. Es ist eine Sprache, die dazu gedacht ist, Präsentationen zu definieren. Sehen Sie sich den vom Formular generierten Code an, notieren Sie sich die IDs der Felder, die Sie interessieren, und ändern Sie das Aussehen dieser Felder über CSS.
Beispiel für long_desc Feld in Ihrem ProductForm (wenn Ihr Formular kein benutzerdefiniertes Präfix hat):
#id_long_desc {
width: 300px;
height: 200px;
}
Zweiter Ansatz ist, die zu übergeben attrs Schlüsselwort zu Ihrem Widget-Konstruktor.
class ProductForm(ModelForm):
long_desc = forms.CharField(widget=forms.Textarea(attrs={'cols': 10, 'rows': 20}))
short_desc = forms.CharField(widget=forms.Textarea)
class Meta:
model = Product
Dritter Ansatz ist es, die nette deklarative Schnittstelle von Newforms für eine Weile zu verlassen und Ihre Widget-Attribute im benutzerdefinierten Konstruktor festzulegen.
class ProductForm(ModelForm):
long_desc = forms.CharField(widget=forms.Textarea)
short_desc = forms.CharField(widget=forms.Textarea)
class Meta:
model = Product
# Edit by bryan
def __init__(self, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor
self.fields['long_desc'].widget.attrs['cols'] = 10
self.fields['long_desc'].widget.attrs['rows'] = 20
Diese Vorgehensweise hat folgende Vorteile:
Sie können Widget-Attribute für Felder definieren, die automatisch aus Ihrem Modell generiert werden, ohne ganze Felder neu zu definieren.
Es hängt nicht vom Präfix Ihres Formulars ab.
Option 3 ist sehr nützlich. Vielleicht könnte das Beispiel auch zeigen, dass die Felder nicht im Formular definiert werden müssen, aber dennoch im Modell definierte Felder überschreiben können, die automatisch durchkommen.
– Dan Breen
3. Dezember 2009 um 16:20 Uhr
Ausgezeichnete Antwort von zuber, aber ich glaube, dass der Beispielcode für den dritten Ansatz einen Fehler enthält. Der Konstruktor sollte sein:
Die Field-Objekte haben keine ‘attrs’-Attribute, aber ihre Widgets schon.
Das sollte wirklich eine Bearbeitung sein und keine eigene Antwort (es ist besser mit dem SO-Modell), aber Sie haben nicht den ausreichenden Ruf, um Bearbeitungen vorzunehmen …
– Josh Hunt
13. März 2009 um 9:30 Uhr
Ich habe die Bearbeitung zusammengeführt, wir können diese Antwort auch behalten, wenn jemand sie abstimmen möchte.
– Ólafur Waage
13. März 2009 um 10:23 Uhr
Tut mir leid, du hast Recht – ich hätte stattdessen einen Kommentar hinterlassen sollen. Beim nächsten Mal mache ich es besser 🙂
– Brian
13. März 2009 um 23:58 Uhr
Bergdesign
Für den Fall, dass Sie ein Add-On wie Grappelli verwenden, das Stile stark nutzt, stellen Sie möglicherweise fest, dass alle überschriebenen Zeilen- und Spaltenattribute ignoriert werden, weil CSS-Selektoren auf Ihr Widget wirken. Dies könnte passieren, wenn Sie den ausgezeichneten zweiten oder dritten Ansatz von zuber oben verwenden.
Verwenden Sie in diesem Fall einfach den ersten Ansatz gemischt mit dem zweiten oder dritten Ansatz, indem Sie anstelle der Attribute „rows“ und „cols“ ein „style“-Attribut festlegen.
Hier ist ein Beispiel für die Änderung drin im dritten Ansatz oben:
Sie können auch CSS-Klassen in der admin.py für den ModelAdmin hinzufügen, ich denke, das wird etwas sauberer. Ein bisschen enttäuscht, dass Grappelli nicht die Spalten/Zeilen verwendet, die der Standard-Django-Administrator bereitstellt.
– radtek
12. Januar 2015 um 16:47 Uhr
Gibt es eine Möglichkeit, eine bestimmte anzuwenden width auf alle Felder im Formular mit einer Codezeile übertragen und nicht explizit einzeln auf sie anwenden?
– Ibo
21. August 2018 um 22:01 Uhr
Mit diesem Ansatz konnte ich das Standard-Erscheinungsbild meines Django-Anmeldeformulars anpassen
– Arif Haque
19. Mai 2021 um 13:29 Uhr
Legen Sie die Zeile und Ihre CSS-Klasse in Ihrer Admin-Modellansicht fest: