如何在django中编写自定义表单字段?

问题描述 投票:0回答:4

我应该在 django 中创建什么以及如何创建自定义表单字段,而不是自定义模型字段?

django django-forms
4个回答
34
投票

表单字段易于自定义:

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

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


17
投票

与开源代码一样,您可以通过阅读源代码本身学到很多东西。 请参阅

django.forms.fields
模块 以了解如何定义所有不同的表单字段 - 其中大多数已经是其他表单字段的子类,因此您可以复制它并更改您需要的内容。


6
投票

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

如果内置 Field 类没有 满足您的需求,您可以轻松创建 自定义字段类。要做到这一点,只需 创建一个子类 django.forms.Field。这只是 要求是它实现了 clean() 方法及其

__init__()
方法接受核心参数 上面提到的(必填、标签、 初始、小部件、帮助文本)。

您可以阅读有关 clean 方法的信息并查看示例在 django 文档。再说一遍,这不是教程,但很有用。

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


0
投票
我发现这些

教程很有帮助:

  • Django 自定义表单字段和小部件
  • Django 表单 I:自定义字段和小部件详细信息
正如您已经提到的,Django

文档有一个部分如何创建自定义模型字段,不幸的是它仅涉及模型字段,而且,它不是很全面。

正如

Daniel 已经建议的那样,您可以通读 django.forms.fields module

source code 来了解如何定义所有不同的表单字段,这可能会帮助您学习如何定义新表单字段。

您还可以从 Stack Overflow 上的自定义表单字段

示例中学到很多东西,例如自定义隐藏字段自定义密码字段自定义表单字段自定义标记字段

注意:如果有人知道其他资源,我已经添加了我所知道的所有好资源。请在评论中告诉我,我会添加它们。

© www.soinside.com 2019 - 2024. All rights reserved.