2009-10-06 35 views

回答

28

表单域易于定制:

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

基本上你刚刚创建一个从外地继承一个类,最像你想要什么,然后重写洁()方法,它返回你的价值想。下面是另一个例子:

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

谢谢。我想我需要编写一个自定义小部件,因为我需要自定义该字段的呈现。 – 2009-10-09 06:57:23

+7

注意:clean()负责运行to_python(),validate()和run_validators()。如果你重写clean()并且不执行这些,你会搞砸了。 – orokusaki 2010-01-22 02:06:47

+3

orokusaki是正确的,如果你重写了clean(),你至少应该把它称为super(UpperCaseField,self).clean(value) – 2013-05-14 14:35:30

7

这不是一个教程,但Django的这个有点文档会谈:

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

您可以阅读有关清洁方法,并参阅示例at the django docs。再次,不是教程,但有用。

我发现我通过阅读一些可用的django应用程序项目(如django-extensions)中的代码来学习很多东西,它们重写表单域并且是很好的学习工具(至少对我而言)。这可以帮助你开始。

14

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

+8

链接到最新的来源:https://github.com/django/django/blob/master/django/forms/fields.py – 2012-12-18 00:42:49

相关问题