基于同一模型中其他字段的django字段验证器

时间:2014-01-08 09:22:42

标签: python 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

这是因为我在初始化期间需要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()中验证 还有其他解决办法吗?

2 个答案:

答案 0 :(得分:0)

假设您的更新来自表单(使用form_valid()建议),也许您可​​以使用the documentation形式的clean()形式。这可以让您执行检查彼此依赖的字段。文档中还有一个示例,可以帮助您进一步。

<强>更新

根据您的评论,我们了解到您尝试在clean()内使用EnvUpdateUpdateView继承自基于类的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子类,并提供fieldsEnvUpdate来自{{1}},就像你自己做的那样以上。这只是你可以轻松尝试的东西。

答案 1 :(得分:0)

如果functional_count应始终小于current_count,则应在模型上的clean()方法中进行检查,而不是随机ModelForm。在正常clean()验证期间将调用模型ModelForm