views:

1273

answers:

3

Is there any good articles that explain custom form fields in django, not custom model fields? I couldn't find any through google.

+1  A: 

It's not a tutorial, but django's docs talks about this a little:

If the built-in Field classes don't meet your needs, you can easily create custom Field classes. To do this, just create a subclass of django.forms.Field. Its only requirements are that it implement a clean() method and that its init() method accept the core arguments mentioned above (required, label, initial, widget, help_text).

You can read about the clean method and see an example at the django docs. Again, not a tutorial, but useful.

I find I am learning a lot by reading the code in some of the the django app projects that are available, such as django-extensions, which override the form fields and are good learning tools (for me, at least). Can help get you started.

thornomad
+3  A: 

As always with open-source code, you'll learn a great deal by reading the source itself. See the django.forms.fields module to see how all the different form fields are defined - most of them are subclasses of others already, so you can just replicate that and change what you need.

Daniel Roseman
+4  A: 

Form fields are easy to customize:

class UpperCaseField(forms.CharField):
    def clean(self, value)
        try:
            return value.upper()
        except:
            raise ValidationError

basically you just create a class that inherits from the field that most resembles what you want, then rewrite the clean() method so that it returns the value you want. Here is another example:

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

custom widgets on the other hand, are a little more useful, but a little more hard to do because there are a few more methods that need to be written so that they work smoothly.

nbv4
Thank you. I think I need to write a custom widget because I need to customize the rendering of the field.
Mert Nuhoglu
Note: clean() is responsible for running to_python(), validate() and run_validators(). If you override clean() and don't implement these, you'll mess things up.
orokusaki