2014-01-08 45 views
1

我有這個模型Django的現場驗證的同型號

class Env(models.Model):  
    functional_count = models.PositiveIntegerField()  
    current_count = models.PositiveIntegerField() 

現在我想functional_count總是小於current_count
所以在創建,

def form_valid(self, form):  
    form.instance.current_count = 0 

這是因爲我initialization.Then我的Python代碼時要current_count從未允許current_count上面去functional_count

問題出現在更新中。

class EnvUpdate(UpdateView): 
    model = Capacity.models.Envapps 
    fields = ['functional_count'] 
    template_name_suffix = '_update_form' 

所以我包括一個驗證器?如果是的話,在哪裏以及如何?
或其他選項是在get_success_url()驗證。
任何其他解決方案?

+0

Django的表單和模型驗證完全記錄在案。你爲什麼不從這裏開始:https://docs.djangoproject.com/en/1.6/ref/models/instances/#validating-objects –

回答

0

假設你的更新,來通過表單(通過使用form_valid()的建議,也許你可以使用表格clean()方法,如the documentation描述的,這可以讓你進行檢查相互依賴等領域。文檔也有

更新

從你的意見應該得到您進一步的示例中,我瞭解到,您嘗試使用clean()EnvUpdate,從基於類的UpdateView視圖繼承。所提供的所有混入Ť通過UpdateView顯然不提供clean()方法,所以你不能覆蓋它。

我實際上是指表單類中的clean()(如下面的鏈接)。因此,它看起來像你需要創建自己的ModelForm類,類似:

class EnvappsForm(forms.ModelForm): 
    class Meta: 
     model = Capacity.models.Envapps 
     fields = ['functional_count'] 

    def clean(self): 
     cleaned_data = super(ContactForm, self).clean() 
     if cleaned_data['functional_count'] >= form.instance.current_count: 
      raise ValidationError('too large') 
     return cleaned_data 

,然後在您的視圖:

class EnvUpdate(UpdateView): 
    model = Capacity.models.Envapps 
    template_name_suffix = '_update_form' 
    form_class = EnvappsForm 

注:這是完全未經測試!我不知道在clean()工作中的比較(即,是否可以找到form.instance.current_count),並且EnvUpdate將重寫form_class(它不應該,但我從未嘗試過)。它只是可能甚至可能,您可以刪除meta子類,並提供modelfieldsEnvUpdate,如上所述。這只是您可以輕鬆嘗試的一種方式。

+0

我曾嘗試鏈接中解釋的方法。 –

+0

結果(或導致的問題)是什麼? – Evert

+0

我曾嘗試鏈接中解釋的方法。但它似乎並沒有進入clean()函數 類EnvappsUpdate(UpdateView): model = Capacity.model ... fields = [...,'f_count',...] def clean (個體): cleaned_data =超級(EnvappsUpdate,自我)清潔機殼() f_count = cleaned_data.get( 「f_count」) c_count = cleand_data.get( 「c_count」) 打印 「內部乾淨」 如果(f_count < c_count): raise forms.ValidationError(「Error。f_count

0

如果functional_count應該始終小於current_count您應該在模型上的clean()方法中檢查它,而不是一些隨機ModelFormclean()將在正常的ModelForm驗證期間被調用。