1

Django 文档(http://docs.djangoproject.com/en/dev/ref/forms/fields/)说你可以创建 django.forms.Field 的子类,只要它实现了 clean() 方法及其init () 方法接受核心参数(required、label、initial、widget、help_text)。

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

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

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

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

CC_security_code = forms.IntegerField(required=False)

谢谢你的帮助!

4

1 回答 1

1

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

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)
于 2011-04-21T21:43:28.997 回答