[英]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
的子類,並提供model
和fields
從EnvUpdate
,你做你之上。 您可以輕松嘗試一下。
如果functional_count
始終小於current_count
,則應在模型的clean()
方法中進行檢查,而不應使用某些隨機的ModelForm
。 在常規ModelForm
驗證期間將調用模型clean()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.