2015-10-13 46 views
0

我仍然在Django初學者和我有問題,使一些工作:Django的:在一個表單字段限制不適用

在從,我有一個字段是一個整數和價值可以是[0 | 1 | 2]。

所以我做了這樣一個工作的東西:

front = forms.IntegerField(label=_('quantity'), initial='', min_value=0, max_value=2) 

這工作正常,如果域中包含其他值,Django的提交之後觸發一個錯誤。

,因爲我需要經常使用的那種場,我犯了一個類的話,那就是:

class Quarter(forms.IntegerField): 
    def __init__(self, val='', min=0,max=2): 
     super(forms.IntegerField, self).__init__() 
     self.initial = val 
     self.min_value = min 
     self.max_value = max 
     self.required = True 
     self.error_messages = {'required': 'This field is required', 
           'max_value': 'number is too high', 
           'min_value': 'number is too low', 
           'invalid': 'Enter a valid number'} 

而且,在我的課,我這樣稱呼它:

rear = Quarter() 

默認參數應該(我認爲)限制後方可以接收的值的範圍。

但是,如果我在後場輸入任何值,Django接受它們全部,當它拒絕它的前面一個。

不應該這個代碼工作,通常? 你能指出我的錯誤,並幫助我使它正常工作嗎?

謝謝。

回答

0

IntegerField類根據傳遞的值在其__init__方法中設置驗證。由於您在超級調用中不會傳遞任何值,因此驗證從不會創建。

不是傳遞什麼,隨後對self設定值,你應該簡單地通過他們的超級電話:

def __init__(self, min=0, max=2, *args, **kwargs): 
    error_messages = {'required': 'This field is required', 
            'max_value': 'number is too high', 
            'min_value': 'number is too low', 
            'invalid': 'Enter a valid number'} 

    super(Quarter, self).__init__(max_value=max, min_value=min, error_messages=error_messages, *args, **kwargs) 
+0

我很抱歉,但我有這個: __init __()得到了一個意外的關鍵字參數'min_value' – Yves

+0

對不起,你應該在Quarter上調用super而不是IntegerField。糾正。 –

+0

@Daniel:關鍵字參數必須在列表參數後發送,所以*參數必須是方法的第一個參數,我錯了嗎?我認爲這會導致Yves提到的錯誤。 – albar

0
super(forms.IntegerField, self).__init__(*args, max_value=max, min_value=min, error_messages=error_messages, **kwargs) 

應該更好地工作

+1

爲什麼?請添加一些關於錯誤的解釋,以及如何使它變得更好。 – spectras

+0

@spectras:對不起,解釋在我的評論下面。 – albar