Tutorial about how to write custom form fields in django?

一曲冷凌霜 提交于 2019-11-30 03:04:01

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.

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.

thornomad

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). This can help get you started.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!