如何制作一个非必需的子类,自定义Django表单字段?

时间:2011-04-21 21:26:57

标签: python django forms required subclass

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

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

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

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

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

CC_security_code = forms.IntegerField(required=False)

感谢您的帮助!

1 个答案:

答案 0 :(得分: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)