如何使子类化的自定义 Django 表单字段不再是必需的?

Posted

技术标签:

【中文标题】如何使子类化的自定义 Django 表单字段不再是必需的?【英文标题】:How to make a subclassed, custom Django form field non-required? 【发布时间】:2011-08-10 15:13:54 【问题描述】:

Django 文档 (http://docs.djangoproject.com/en/dev/ref/forms/fields/) 说您可以创建 django.forms.Field 的子类,只要它实现 clean() 方法并且其 init() 方法接受核心参数(必需、标签、初始、小部件、帮助文本)。

我试图使用以下 Django Snippet 中的代码: http://djangosnippets.org/snippets/907/ 实现信用卡字段,但我希望它不是必需的。设置 required=false 适用于普通字段,但不适用于此 sn-p 中的子类字段。 sn-p 缺少什么? (我认为它的 init() 方法丢失或不接受 Django 文档中提到的核心参数,但我不知道如何解决这个问题。)

例如,在这些自定义字段上设置 required 为 false,表单仍然需要它们:

CC_number = CreditCardField(required=False)
CC_expiration_date = CCExpField(required=False)

表单不需要此字段(按预期工作):

CC_security_code = forms.IntegerField(required=False)

感谢您的帮助!

【问题讨论】:

【参考方案1】:

这应该可以通过修改CreditCardField 中的 clean 方法(方法的前 2 行):

def clean(self, value):
    if not value and not self.required:
        return value
    """Check if given CC number is valid and one of the
       card types we accept"""
    if value and (len(value) < 13 or len(value) > 16):
        raise forms.ValidationError("Please enter in a valid "+\
                "credit card number.")
    elif self.get_cc_type(value) not in ("Visa", "MasterCard",
                                             "American Express"):
        raise forms.ValidationError("Please enter in a Visa, "+\
            "Master Card, or American Express credit card number.")
    return super(CreditCardField, self).clean(value)

【讨论】:

以上是关于如何使子类化的自定义 Django 表单字段不再是必需的?的主要内容,如果未能解决你的问题,请参考以下文章

Django用户模型电子邮件字段:如何使其成为强制性

Django中的自定义纬度/经度表单字段

Django 表单子类化 - 如何修改继承字段的某些属性,同时保留其他属性?

如何使 Django 表单字段唯一?

Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号

Django,模型和表单:替换“此字段为必填项”消息