2011-04-21 33 views
1

Django文檔(http://docs.djangoproject.com/en/dev/ref/forms/fields/)說,只要它實現了clean()方法,並且它的()方法接受了核心參數(必需的,標籤,初始值等),就可以創建django.forms.Field的子類。小部件,幫助文本)。如何創建一個不需要的子類,自定義Django表單域?

我嘗試使用的代碼下面的Django的片段: http://djangosnippets.org/snippets/907/ 實現信用卡領域,但我希望它是不必需的。設置required = false對於普通字段來說工作得很好,但對於這個片段中的subclassed字段不適用。缺少什麼片段? (我認爲這是初始化()方法缺失或不接受Django文檔中提到的核心論點,但我不知道如何解決這個問題。)

例如,設置需要爲false,這些自定義領域,形式仍然要求他們:

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

形式並不需要此字段(它按預期工作):

CC_security_code = forms.IntegerField(required=False) 

感謝您的幫助!

回答

1

這應該工作,在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) 
+0

如此簡單,它完美的作品。非常感謝Dan。 – fieryred 2011-04-22 04:51:09

相關問題