Django füllt normalerweise horizontalen Raum aus, wenn Einträge im Administrator hinzugefügt oder bearbeitet werden. In einigen Fällen ist dies jedoch eine echte Platzverschwendung, wenn ein Datumsfeld mit einer Breite von 8 Zeichen oder ein CharField mit 6 oder 8 Zeichen bearbeitet wird Zeichen breit, und dann geht das Bearbeitungsfeld auf 15 oder 20 Zeichen.
Wie kann ich dem Administrator mitteilen, wie breit ein Textfeld sein soll oder wie hoch ein TextField-Bearbeitungsfeld ist?
Antworten:
Sie sollten ModelAdmin.formfield_overrides verwenden .
Es ist ganz einfach -
admin.py
definieren Sie:quelle
filter_horizontal
oderfilter_vertical
für die entsprechenden Felder in YourModelAdmin festgelegt ist. Ich habe einige Zeit damit verbracht, dies herauszufinden.models.TextField: {'widget': Textarea(attrs={'rows':4})}
aber die Breite wurde auch kleiner.Sie können beliebige HTML-Attribute für ein Widget mithilfe der Eigenschaft "attrs" festlegen .
Sie können dies im Django-Administrator mit formfield_for_dbfield tun:
oder mit einer benutzerdefinierten Widget-Unterklasse und dem Wörterbuch formfield_overrides :
quelle
So ändern Sie die Breite für ein bestimmtes Feld.
Erstellt über ModelAdmin.get_form :
quelle
Eine schnelle und schmutzige Option besteht darin, einfach eine benutzerdefinierte Vorlage für das betreffende Modell bereitzustellen.
Wenn Sie eine Vorlage mit dem Namen erstellen, verwendet
admin/<app label>/<class name>/change_form.html
der Administrator diese Vorlage anstelle der Standardvorlage. Wenn Sie also ein ModellPerson
in einer App mit dem Namen habenpeople
, erstellen Sie eine Vorlage mit dem Namenadmin/people/person/change_form.html
.Alle Admin-Vorlagen haben einen
extrahead
Block, den Sie überschreiben können, um Inhalte in das<head>
Feld einzufügenid_<field-name>
. Das letzte Puzzleteil ist die Tatsache, dass jedes Feld eine HTML-ID von hat .Sie können also Folgendes in Ihre Vorlage einfügen:
quelle
Wenn Sie die Attribute für eine Instanz pro Feld ändern möchten, können Sie die Eigenschaft "attrs" direkt zu Ihren Formulareinträgen hinzufügen.
beispielsweise:
Die Eigenschaft "attrs" übergibt im Wesentlichen das HTML-Markup, mit dem das Formularfeld angepasst wird. Jeder Eintrag ist ein Tupel des Attributs, das Sie überschreiben möchten, und des Werts, mit dem Sie es überschreiben möchten. Sie können so viele Attribute eingeben, wie Sie möchten, solange Sie jedes Tupel durch ein Komma trennen.
quelle
Der beste Weg, den ich gefunden habe, ist ungefähr so:
Es ist viel besser für Modelform als zwingende Felder mit verschiedenen Widgets, wie es bewahrt
name
undhelp_text
Attribute und auch die Standardwerte der Modellfelder, so dass Sie nicht in Ihrer Form haben zu kopieren.quelle
Ich hatte ein ähnliches Problem mit TextField. Ich verwende Django 1.0.2 und wollte den Standardwert für 'Zeilen' im zugehörigen Textbereich ändern. formfield_overrides existiert in dieser Version nicht. Das Überschreiben von formfield_for_dbfield hat funktioniert, aber ich musste es für jede meiner ModelAdmin-Unterklassen tun, da dies sonst zu einem Rekursionsfehler führen würde. Schließlich stellte ich fest, dass das Hinzufügen des folgenden Codes zu models.py funktioniert:
Verwenden Sie dann MyTextField anstelle von TextField, wenn Sie Ihre Modelle definieren. Ich habe es von angepasst dieser Antwort auf eine ähnliche Frage .
quelle
Es ist gut in Django FAQ beschrieben :
F: Wie ändere ich die Attribute für ein Widget in einem Feld in meinem Modell?
A: Überschreiben Sie das Feld formfield_for_db in der Klasse ModelAdmin / StackedInline / TabularInline
quelle
Sie können Ihre Feldgrößen jederzeit in einem benutzerdefinierten Stylesheet festlegen und Django anweisen, diese für Ihre ModelAdmin-Klasse zu verwenden:
quelle
Für 1.6 musste ich mithilfe von Formularen die Attribute des Textbereichs im Zeichenfeld angeben:
quelle
Gleiche Antwort wie msdin, jedoch mit TextInput anstelle von TextArea:
quelle
Hier ist eine einfache und dennoch flexible Lösung. Verwenden Sie ein benutzerdefiniertes Formular, um einige Widgets zu überschreiben.
Die in angegebenen Widgets
ElephantForm
ersetzen die Standard- Widgets . Der Schlüssel ist die Zeichenfolgendarstellung des Feldes. Felder, die nicht im Formular angegeben sind, verwenden das Standard-Widget.Beachten Sie, dass , obwohl
age
eine istIntegerField
können wir die VerwendungTextInput
, widget, denn im Gegensatz zu derNumberInput
,TextInput
die akzeptiertsize
Attribut.Diese Lösung wird in diesem Artikel beschrieben .
quelle
Wenn Sie mit einem ForeignKey-Feld arbeiten, das Auswahlmöglichkeiten / Optionen / ein Dropdown-Menü enthält, können Sie
formfield_for_foreignkey
in der Admin-Instanz Folgendes überschreiben :Weitere Informationen zu diesem Muster hier und hier .
quelle
Und noch ein Beispiel:
Wenn Sie nur eine bestimmte Feldgröße bearbeiten möchten, können Sie diese verwenden.
quelle