我有这个模型
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
。然后我的python代码永远不允许current_count
超过functional_count
。
问题在于更新。
class EnvUpdate(UpdateView):
model = Capacity.models.Envapps
fields = ['functional_count']
template_name_suffix = '_update_form'
那么我是否包含验证器?如果是,在哪里以及如何?
或者其他选项是在get_success_url()
中验证
还有其他解决办法吗?
答案 0 :(得分:0)
假设您的更新来自表单(使用form_valid()
建议),也许您可以使用the documentation形式的clean()
形式。这可以让您执行检查彼此依赖的字段。文档中还有一个示例,可以帮助您进一步。
<强>更新强>
根据您的评论,我们了解到您尝试在clean()
内使用EnvUpdate
,UpdateView
继承自基于类的UpdateView
视图。通过clean()
提供的所有mixins显然不提供clean()
方法,因此您无法覆盖它。
我实际上是指表单类中的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
(如下所示)。所以,看起来你需要创建自己的ModelForm类,如:
class EnvUpdate(UpdateView):
model = Capacity.models.Envapps
template_name_suffix = '_update_form'
form_class = EnvappsForm
然后在你看来:
clean()
注意:这是完全未经测试的!我不知道EnvUpdate
中的比较是否有效(即,如果可以找到form.instance.current_count),而且meta
将覆盖form_class(它不应该,但是我'从未尝试过)。它只是可能甚至可以移除model
子类,并提供fields
和EnvUpdate
来自{{1}},就像你自己做的那样以上。这只是你可以轻松尝试的东西。
答案 1 :(得分:0)
如果functional_count
应始终小于current_count
,则应在模型上的clean()
方法中进行检查,而不是随机ModelForm
。在正常clean()
验证期间将调用模型ModelForm
。