Поля формы легко настраиваются:
class UpperCaseField(forms.CharField):
def clean(self, value)
try:
return value.upper()
except:
raise ValidationError
По сути, вы просто создаете класс, который наследует от поля, которое больше всего напоминает то, что вы хотите, а затем переписываете метод clean (), чтобы он возвращал желаемое значение. Вот еще один пример:
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
пользовательские виджеты , с другой стороны, немного более полезны, но сделать их немного сложнее, поскольку нужно написать еще несколько методов, чтобы они работали без сбоев.