我应该在 django 中创建什么以及如何创建自定义表单字段,而不是自定义模型字段?
表单字段易于自定义:
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
另一方面,自定义小部件更有用,但更难做,因为需要编写更多方法才能顺利工作。
与开源代码一样,您可以通过阅读源代码本身学到很多东西。 请参阅
django.forms.fields
模块 以了解如何定义所有不同的表单字段 - 其中大多数已经是其他表单字段的子类,因此您可以复制它并更改您需要的内容。
这不是教程,但 django 的文档对此进行了一些讨论:
如果内置 Field 类没有 满足您的需求,您可以轻松创建 自定义字段类。要做到这一点,只需 创建一个子类 django.forms.Field。这只是 要求是它实现了 clean() 方法及其
方法接受核心参数 上面提到的(必填、标签、 初始、小部件、帮助文本)。__init__()
您可以阅读有关 clean 方法的信息并查看示例在 django 文档。再说一遍,这不是教程,但很有用。
我发现通过阅读一些可用的 django 应用程序项目中的代码,我学到了很多东西,例如 django-extensions,它覆盖了表单字段,并且是很好的学习工具(至少对我来说)。这可以帮助您入门。
教程很有帮助:
正如您已经提到的,Django文档有一个部分如何创建自定义模型字段,不幸的是它仅涉及模型字段,而且,它不是很全面。
正如Daniel 已经建议的那样,您可以通读 django.forms.fields
module
的source code 来了解如何定义所有不同的表单字段,这可能会帮助您学习如何定义新表单字段。 您还可以从 Stack Overflow 上的自定义表单字段
示例中学到很多东西,例如自定义隐藏字段、自定义密码字段、自定义表单字段和自定义标记字段。
注意:如果有人知道其他资源,我已经添加了我所知道的所有好资源。请在评论中告诉我,我会添加它们。