Weź na przykład ten bardzo prosty formularz:
class SearchForm(Form):
q = forms.CharField(label='search')
Zostanie to zrenderowane w szablonie:
<input type="text" name="q" id="id_q" />
Chcę jednak dodać placeholder
atrybut do tego pola o wartości Search
tak, aby HTML wyglądał mniej więcej tak:
<input type="text" name="q" id="id_q" placeholder="Search" />
Najlepiej chciałbym przekazać wartość symbolu zastępczego do CharField
klasy formularza przez słownik lub coś w stylu:
q = forms.CharField(label='search', placeholder='Search')
Jaki byłby najlepszy sposób na osiągnięcie tego?
python
django
django-forms
Joelbitar
źródło
źródło
forms.TextInput
zrobićattrs={'placeholder': 'Search'}
deklarację?W przypadku ModelForm możesz użyć klasy Meta w następujący sposób:
źródło
Wszystkie pozostałe metody są dobre. Jeśli jednak nie chcesz określać pola (np. W przypadku niektórych metod dynamicznych), możesz użyć tego:
Pozwala także na to, by symbol zastępczy zależał od instancji dla ModelForms z określoną instancją.
źródło
ModelMultipleChoiceField
. Dzięki!for f in MyCommentForm.base_fields.values(): f.widget.attrs["placeholder"] = f.label
ale bardziej podoba mi się twoja metoda konstruktora.Możesz użyć tego kodu, aby dodać symbol zastępczy attr dla każdego pola TextInput w formularzu. Tekst zastępczy zostanie pobrany z etykiet pola modelowego.
źródło
Świetne pytanie. Istnieją trzy rozwiązania, o których wiem:
Rozwiązanie nr 1
Zamień domyślny widget.
Rozwiązanie nr 2
Dostosuj domyślny widget. Jeśli używasz tego samego widżetu, którego zwykle używa pole, możesz go po prostu dostosować zamiast tworzyć zupełnie nowy.
Rozwiązanie nr 3
Wreszcie, jeśli pracujesz z formularzem modelu, to ( oprócz dwóch poprzednich rozwiązań ) masz opcję określenia niestandardowego widgetu dla pola poprzez ustawienie
widgets
atrybutuMeta
klasy wewnętrznej .źródło
self.fields
, np .:for field_name in self.fields: self.fields[field_name].widget.attrs.update({"placeholder": sth})
Nie jest pożądane, aby wiedzieć, jak utworzyć instancję widgetu, gdy chcesz po prostu zastąpić jego symbol zastępczy.
źródło
Przez większość czasu po prostu chcę, aby wszystkie symbole zastępcze były równe pełnej nazwie pola zdefiniowanej w moich modelach
Dodałem mixin, aby łatwo to zrobić w dowolnej formie, którą utworzę,
I
źródło
Po przyjrzeniu się twojej metodzie użyłem tej metody do jej rozwiązania.
źródło