2017-06-15 97 views
1

我試圖覆蓋「max_value」屬性在子類沒有成功。我做錯了什麼?Django表單覆蓋FloatField max_value屬性

父類

class ParentForm(forms.Form): 

    width = forms.FloatField(label='Width (B)', max_value=100, min_value=5) 
    # others fields 

子類

class ChildForm(ParentForm): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.fields['width'].max_value = 50 
+0

它應該工作。如果有的話,添加你的視圖代碼和異常。你使用的是什麼版本的Django和Python? –

+0

我正在使用Django 1.11和Python 3.6。例如,該代碼適用於**「label」**屬性,但不適用於**「max_value」**和**「min_value」**。 – Eduardo

+0

你認爲它不起作用,因爲它在驗證時不會失敗? –

回答

2

max_value正確的設置問題是,你不更新驗證

IntegerField__init__這是FloatField父它這樣做

def __init__(self, max_value=None, min_value=None, *args, **kwargs): 
     self.max_value, self.min_value = max_value, min_value 
     if kwargs.get('localize') and self.widget == NumberInput: 
      # Localized number input is not well supported on most browsers 
      kwargs.setdefault('widget', super(IntegerField, self).widget) 
     super(IntegerField, self).__init__(*args, **kwargs) 

     if max_value is not None: 
      self.validators.append(validators.MaxValueValidator(max_value)) 
     if min_value is not None: 
      self.validators.append(validators.MinValueValidator(min_value)) 

所以對於完全更新max_valuemin_value你需要同時更新驗證,這裏是一個辦法

from django.core import validators 

class ChildForm(ParentForm): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     max_value = 50 
     self.fields['width'].max_value = max_value 
     for validator in self.fields['width'].validators: 
      if isinstance(validator, validators.MaxValueValidator): 
       validator.limit_value = max_value 
+0

我收到一個異常。 _'ChildForm'對象沒有屬性'validators'._我認爲這是一個改進。我會努力的。 – Eduardo

+0

@Eduardo是的,應該是'self.fields ['width']。validators'修復了我的答案。 –

+0

完美!現在正在工作。 – Eduardo

-1

通行證類名和自超

class ChildForm(ParentForm): 

    def __init__(self, *args, **kwargs): 
     super(ChildForm, self).__init__(*args, **kwargs) 
     self.fields['width'].max_value = 50 
+0

我正在使用Python 3.6。我不需要那些論據。 – Eduardo