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

Mer*_*glu 23 django customization django-forms

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

pri*_*stc 32

表单字段易于自定义:

class UpperCaseField(forms.CharField):
    def clean(self, value)
        try:
            return value.upper()
        except:
            raise ValidationError
Run Code Online (Sandbox Code Playgroud)

基本上你只是创建一个继承自你想要的字段的类,然后重写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
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:clean()负责运行to_python(),validate()和run_validators().如果你覆盖clean()并且没有实现这些,你就会搞砸了. (7认同)
  • orokusaki是对的,如果你覆盖clean(),你至少应该用`super(UpperCaseField,self).clean(value)来调用它的超级实现. (4认同)

Dan*_*man 16

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

  • 指向最新来源的链接:https://github.com/django/django/blob/master/django/forms/fields.py (8认同)

tho*_*mad 6

这不是一个教程,但是django的文档稍微谈到了这个:

如果内置的Field类不能满足您的需求,您可以轻松创建自定义Field类.为此,只需创建django.forms.Field的子类.它的唯一要求是它实现了一个clean()方法,并且它的__init__() 方法接受上面提到的核心参数(required,label,initial,widget,help_text).

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

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