Czy istnieją dobre artykuły wyjaśniające niestandardowe pola formularza w django, a nie niestandardowe pola modelu? Nie mogłem znaleźć żadnego przez google.Samouczek dotyczący pisania niestandardowych pól formularza w django?
Odpowiedz
Pola formularzy można łatwo dostosować:
class UpperCaseField(forms.CharField):
def clean(self, value)
try:
return value.upper()
except:
raise ValidationError
zasadzie wystarczy utworzyć klasę, która dziedziczy z pola, który najbardziej przypomina to, co chcesz, a następnie przepisać czystą metodę() tak, że zwraca wartość, którą chcieć. Oto kolejny przykład:
class MyObjectField(forms.ModelChoiceField):
# in this case, 'value' is a string representing
# the primary key of a MyObject
def clean(self, value):
try:
return MyObject.objects.get(pk=value)
except:
raise ValidationError
zwyczaj widgety z drugiej strony, są trochę bardziej użyteczne, ale trochę bardziej trudne do zrobienia, ponieważ istnieje jeszcze kilka metod, które muszą być napisane tak, że pracują płynnie.
To nie jest poradnik, ale docs rozmowy Django o tym trochę:
Jeśli wbudowana w zajęciach terenowych nie swoich potrzeb, można łatwo tworzyć niestandardowych klas dziedzinie. Aby to zrobić, po prostu utworzyć podklasę django.forms.Field. Jedyne wymagania to : implementują metodę clean() , a jej metoda
__init__()
przyjmuje wymienione wyżej podstawowe argumenty (wymagane, etykieta, początkowa, widżet, tekst pomocy).
Możesz przeczytać o czystej metodzie i zobaczyć przykład at the django docs. Ponownie nie jest to samouczek, ale jest przydatny.
Uważam, że dużo się uczę, czytając kod w niektórych dostępnych projektach aplikacji django, takich jak django-extensions, które zastępują pola formularza i są narzędziami dobrej nauki (przynajmniej dla mnie). To może pomóc Ci zacząć.
Jak zawsze z kodem open-source, wiele się nauczysz, czytając samo źródło. Zobacz moduł django.forms.fields
, aby zobaczyć, jak zdefiniowane są wszystkie różne pola formularza - większość z nich to już podklasy innych, więc możesz po prostu powielić to i zmienić to, czego potrzebujesz.
Link do najnowszego źródła: https://github.com/django/django/blob/master/django/forms/fields.py –
Dziękuję. Myślę, że muszę napisać niestandardowy widget, ponieważ muszę dostosować renderowanie pola. –
Uwaga: clean() odpowiada za uruchamianie to_python(), validate() i run_validators(). Jeśli zastąpisz clean() i nie zaimplementujesz ich, zepsujesz sytuację. – orokusaki
orokusaki ma rację, jeśli zastąpisz clean(), powinieneś przynajmniej nazwać to super implementacją za pomocą 'super (UpperCaseField, self) .clean (value)' –