Как сделать подклассовое, настраиваемое поле формы Django необязательным? - PullRequest
1 голос
/ 22 апреля 2011

Документы Django (http://docs.djangoproject.com/en/dev/ref/forms/fields/) говорят, что вы можете создать подкласс django.forms.Field, если он реализует метод clean () и его метод init () принимаетосновные аргументы (обязательно, label, initial, widget, help_text).

Я пытался использовать код в следующем фрагменте Django: 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 Ответ

1 голос
/ 22 апреля 2011

Это должно сработать, изменив метод очистки в CreditCardField (первые 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)
...