2009-10-06 18 views

Odpowiedz

28

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.

+1

Dziękuję. Myślę, że muszę napisać niestandardowy widget, ponieważ muszę dostosować renderowanie pola. –

+7

Uwaga: clean() odpowiada za uruchamianie to_python(), validate() i run_validators(). Jeśli zastąpisz clean() i nie zaimplementujesz ich, zepsujesz sytuację. – orokusaki

+3

orokusaki ma rację, jeśli zastąpisz clean(), powinieneś przynajmniej nazwać to super implementacją za pomocą 'super (UpperCaseField, self) .clean (value)' –

7

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ąć.

14

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.

+8

Link do najnowszego źródła: https://github.com/django/django/blob/master/django/forms/fields.py –

Powiązane problemy