【问题标题】:Tutorial about how to write custom form fields in django?关于如何在 django 中编写自定义表单字段的教程?
【发布时间】:2010-12-04 08:25:18
【问题描述】:

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

【问题讨论】:

    标签: django django-forms customization


    【解决方案1】:

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

    如果内置的 Field 类没有 满足您的需求,您可以轻松创建 自定义字段类。为此,只需 创建一个子类 django.forms.Field。这只是 要求是它实现了一个 clean() 方法和它的__init__() 方法接受核心参数 上述(必填,标签, 初始,小部件,帮助文本)。

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

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

    【讨论】:

      【解决方案2】:

      表单字段易于自定义:

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

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

      【讨论】:

      • 谢谢。我想我需要编写一个自定义小部件,因为我需要自定义字段的呈现。
      • 注意:clean() 负责运行 to_python()、validate() 和 run_validators()。如果你重写 clean() 并且不实现这些,你会搞砸的。
      • orokusaki 是对的,如果你重写 clean(),你至少应该用super(UpperCaseField, self).clean(value) 调用它的超级实现
      【解决方案3】:

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

      【讨论】:

      猜你喜欢
      • 2010-12-05
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 2017-12-17
      • 2012-04-21
      • 2012-11-11
      • 2015-09-14
      相关资源
      最近更新 更多