2014-01-08 46 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验证期间被调用。