Załóżmy, że mam formularz
class SampleClass(forms.Form):
name = forms.CharField(max_length=30)
age = forms.IntegerField()
django_hacker = forms.BooleanField(required=False)
Czy istnieje sposób, aby zdefiniować klasy css w każdym polu, dzięki czemu mogę użyć jQuery na podstawie klasy na mojej renderowanej stronie?
Miałem nadzieję, że nie będę musiał ręcznie budować formularza.
python
django
django-forms
Ashchristopher
źródło
źródło
Odpowiedzi:
Jeszcze jedno rozwiązanie, które nie wymaga zmian w kodzie Pythona, a więc jest lepsze dla projektantów i jednorazowych zmian prezentacji: django-widget-tweaks . Mam nadzieję, że ktoś uzna to za przydatne.
źródło
Odpowiedziałem na własne pytanie. Westchnienie
http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.attrs
Nie wiedziałem, że został przekazany do konstruktora widgetów.
źródło
Oto inne rozwiązanie do dodawania definicji klas do widżetów po zadeklarowaniu pól w klasie.
źródło
Użyj ulepszeń django-widget- , jest łatwy w użyciu i działa całkiem dobrze.
W przeciwnym razie można to zrobić za pomocą niestandardowego filtru szablonu.
Biorąc pod uwagę, że renderujesz formularz w ten sposób:
form.subject jest instancją BoundField, która ma metodę as_widget .
możesz utworzyć niestandardowy filtr „addcss” w „my_app / templatetags / myfilters.py”
A następnie zastosuj filtr:
Form.subjects będą następnie renderowane za pomocą klasy css „MyClass”.
Mam nadzieję, że to pomoże.
EDYCJA 1
Aktualizacja filtru według dimyG „s odpowiedź
Dodaj link do django-widget-tweak
EDYCJA 2
źródło
get('class', None).split(' ')
zakończy się niepowodzeniem, jeśli znacznik nie ma atrybutu class, tak jakNone
jest zwracany. Zmiana naget('class', '').split(' ')
działającąRozwijając metodę wskazaną na docs.djangoproject.com:
Pomyślałem, że trudno jest znać rodzimy typ widżetu dla każdego pola, i pomyślałem, że zabawne jest przesłonięcie domyślnej nazwy, aby umieścić nazwę klasy w polu formularza. Wydaje mi się, że to działa:
Wydaje mi się to trochę czystsze.
źródło
Jeśli chcesz, aby wszystkie pola w formularzu dziedziczyły określoną klasę, wystarczy zdefiniować klasę nadrzędną, która dziedziczy po niej
forms.ModelForm
, a następnie dziedziczy po niejPomogło mi to automatycznie dodać
'form-control'
klasę do wszystkich pól we wszystkich formularzach mojej aplikacji, bez dodawania replikacji kodu.źródło
Oto prosty sposób zmiany widoku. dodaj poniżej w widoku tuż przed przekazaniem go do szablonu.
źródło
Po prostu dodaj klasy do formularza w następujący sposób.
źródło
Oto wariant powyższego, który da wszystkim polom tę samą klasę (np. Jquery ładne zaokrąglone rogi).
źródło
Możesz spróbować tego ..
Możesz zobaczyć więcej informacji w: Widżety Django
źródło
Na przykład, jeśli chcesz dodać klasę do pola formularza w szablonie (nie w view.py lub form.py), na przykład w przypadkach, gdy chcesz zmodyfikować aplikacje innych firm bez przesłonięcia ich widoków, filtr filtra zgodnie z opisem w odpowiedzi Charlesthk jest bardzo wygodna. Ale w tej odpowiedzi filtr szablonu zastępuje wszystkie istniejące klasy, które może mieć pole.
Próbowałem dodać to jako edycję, ale zasugerowano, aby napisać jako nową odpowiedź.
Oto tag szablonu, który szanuje istniejące klasy pola:
źródło
Jak się okazuje, można to zrobić w konstruktorze formularzy ( funkcja init ) lub po zainicjowaniu klasy formularza. Jest to czasem wymagane, jeśli nie piszesz własnego formularza, który pochodzi z innego miejsca -
źródło
Możesz także użyć Django Crispy Forms , jest to świetne narzędzie do definiowania formularzy na wypadek, gdybyś chciał użyć frameworka CSS, takiego jak Bootstrap lub Foundation. I łatwo jest tam określić klasy dla pól formularza.
Twoja klasa form chciałaby wtedy:
źródło