Angenommen, ich habe ein Formular
class SampleClass(forms.Form):
name = forms.CharField(max_length=30)
age = forms.IntegerField()
django_hacker = forms.BooleanField(required=False)
Gibt es eine Möglichkeit für mich, CSS-Klassen für jedes Feld so zu definieren, dass ich jQuery basierend auf der Klasse auf meiner gerenderten Seite verwenden kann?
Ich hatte gehofft, das Formular nicht manuell erstellen zu müssen.
python
django
django-forms
Ashchristopher
quelle
quelle
Antworten:
Eine weitere Lösung, die keine Änderungen im Python-Code erfordert und daher besser für Designer und einmalige Präsentationsänderungen geeignet ist : Django-Widget-Tweaks . Hoffe, jemand wird es nützlich finden.
quelle
Beantwortete meine eigene Frage. Seufzer
http://docs.djangoproject.com/de/dev/ref/forms/widgets/#django.forms.Widget.attrs
Ich wusste nicht, dass es an den Widget-Konstruktor übergeben wurde.
quelle
Hier ist eine weitere Lösung zum Hinzufügen von Klassendefinitionen zu den Widgets, nachdem die Felder in der Klasse deklariert wurden.
quelle
Verwenden Sie Django-Widget-Tweaks , es ist einfach zu bedienen und funktioniert ziemlich gut.
Andernfalls kann dies mithilfe eines benutzerdefinierten Vorlagenfilters erfolgen.
In Anbetracht dessen, dass Sie Ihr Formular folgendermaßen rendern:
form.subject ist eine Instanz von BoundField mit der Methode as_widget .
Sie können einen benutzerdefinierten Filter "addcss" in "my_app / templatetags / myfilters.py" erstellen.
Und dann wenden Sie Ihren Filter an:
form.subjects werden dann mit der CSS-Klasse "MyClass" gerendert.
Ich hoffe das hilft.
BEARBEITEN 1
Aktualisieren Sie den Filter gemäß der Antwort von dimyG
Django-Widget-Tweak-Link hinzufügen
BEARBEITEN 2
quelle
get('class', None).split(' ')
schlägt fehl, wenn das Tag nicht über das zurückgegebene Klassenattribut verfügtNone
. Ändern es zuget('class', '').split(' ')
funktioniertErweiterung der Methode, auf die unter docs.djangoproject.com verwiesen wird:
Ich fand es mühsam, den nativen Widget-Typ für jedes Feld kennen zu müssen, und fand es lustig, die Standardeinstellung zu überschreiben, nur um einen Klassennamen in ein Formularfeld einzufügen. Das scheint bei mir zu funktionieren:
Das scheint mir ein bisschen sauberer zu sein.
quelle
Wenn alle Felder im Formular eine bestimmte Klasse erben sollen, definieren Sie einfach eine übergeordnete Klasse, die von dieser erbt
forms.ModelForm
und dann von ihr erbtDies hat mir geholfen, die
'form-control'
Klasse automatisch zu allen Feldern in allen Formularen meiner Anwendung hinzuzufügen, ohne die Replikation von Code hinzuzufügen.quelle
Hier ist eine einfache Möglichkeit, die Ansicht zu ändern. Fügen Sie unten in der Ansicht hinzu, bevor Sie es in die Vorlage übergeben.
quelle
Fügen Sie die Klassen einfach wie folgt zu Ihrem Formular hinzu.
quelle
Hier ist eine Variation der obigen, die allen Feldern die gleiche Klasse gibt (z. B. schöne, abgerundete Ecken).
quelle
Sie können dies versuchen ..
Weitere Informationen finden Sie unter: Django Widgets
quelle
Wenn Sie dem Feld eines Formulars in einer Vorlage eine Klasse hinzufügen möchten (nicht in view.py oder form.py), z. B. in Fällen, in denen Sie Apps von Drittanbietern ändern möchten, ohne deren Ansichten zu überschreiben, dann einen Vorlagenfilter wie beschrieben in Charlesthk Antwort ist sehr bequem. In dieser Antwort überschreibt der Vorlagenfilter jedoch alle vorhandenen Klassen, die das Feld möglicherweise hat.
Ich habe versucht, dies als Bearbeitung hinzuzufügen, aber es wurde vorgeschlagen, es als neue Antwort zu schreiben.
Hier ist also ein Vorlagen-Tag, das die vorhandenen Klassen des Felds berücksichtigt:
quelle
Wie sich herausstellt, können Sie dies im Formularkonstruktor ( Init- Funktion) oder nach dem Initiieren der Formularklasse tun . Dies ist manchmal erforderlich, wenn Sie kein eigenes Formular schreiben und dieses Formular von einem anderen Ort stammt -
quelle
Sie können auch Django Crispy Forms verwenden ist ein großartiges Tool zum Definieren von Formularen, falls Sie ein CSS-Framework wie Bootstrap oder Foundation verwenden möchten. Dort können Sie ganz einfach Klassen für Ihre Formularfelder angeben.
Ihre Formularklasse möchte dies dann:
quelle