关于如何在django中编写自定义表单字段的教程?

时间:2009-10-06 16:54:01

标签: django django-forms customization

是否有任何好文章解释django中的自定义表单字段,而不是自定义模型字段?我通过谷歌找不到任何东西。

3 个答案:

答案 0 :(得分:32)

表单字段易于自定义:

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
另一方面,

自定义小部件更有用,但更难做,因为还有一些方法需要编写才能顺利运行。

答案 1 :(得分:16)

与开源代码一样,通过阅读源代码本身,您将学到很多东西。请参阅django.forms.fields模块,了解如何定义所有不同的表单字段 - 其中大多数已经是其他表的子类,因此您可以复制它并更改所需内容。

答案 2 :(得分:6)

这不是一个教程,但是django的文档对此进行了一些讨论:

  

如果内置的Field类没有   满足您的需求,您可以轻松创建   自定义字段类。要做到这一点,只需   创建一个子类   django.forms.Field。这只是   要求是它实现了   clean()方法及其__init__()   方法接受核心参数   上面提到的(必需的,标签,   initial,widget,help_text)。

您可以阅读有关clean方法的信息,并查看示例at the django docs。同样,不是教程,但很有用。

我发现我通过阅读一些可用的django应用程序项目中的代码来学习很多东西,例如django-extensions,它覆盖了表单字段并且是很好的学习工具(对我来说,至少)。这可以帮助您入门。