簡體   English   中英

基於同一模型中其他字段的Django字段驗證器

[英]django field validator based on other field in same model

我有這個模特

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

這是因為我希望current_count initialization.Then在我的Python代碼永遠不會允許current_count上面去functional_count

問題來自更新。

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

那我包括驗證器嗎? 如果是,在哪里和如何?
或其他選擇是在get_success_url()進行驗證。
還有其他解決方案嗎?

假設您的更新是通過表單form_valid() (如使用form_valid()所建議的form_valid() ,也許您可​​以按照文檔中的描述使用clean()方法,這使您可以檢查彼此依賴的字段。文檔中還有一個示例,可以使您更進一步。

更新

根據您的評論,我了解到您嘗試在EnvUpdate使用clean() ,該方法繼承自基於類的UpdateView視圖。 通過UpdateView提供的所有mixin顯然都沒有提供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 ,你做你之上。 您可以輕松嘗試一下。

如果functional_count始終小於current_count ,則應在模型的clean()方法中進行檢查,而不應使用某些隨機的ModelForm 在常規ModelForm驗證期間將調用模型clean()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM