基于同一mod中其他字段的Django字段验证器

2024-10-03 00:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个模型

class Env(models.Model):    
    functional_count = models.PositiveIntegerField()    
    current_count = models.PositiveIntegerField()

现在我希望functional_count始终小于current_count
所以在创作过程中

^{pr2}$

这是因为我希望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()中验证。
还有其他解决办法吗?在


Tags: 代码模型envmodelmodels过程countcurrent
2条回答

如果functional_count总是小于current_count,那么应该在模型的clean()方法中检查它,而不是随机的ModelForm。模型clean()将在正常ModelForm验证期间调用。在

假设您的更新是通过一个表单(正如使用form_valid()所建议的那样),也许您可以使用表单clean()方法,如the documentation所述。这允许您对相互依赖的字段执行检查。文档中还有一个示例,可以让您更进一步。在

更新

从您的评论中,我了解到您试图在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

然后在你看来:

^{pr2}$

注意:这是完全未经测试的!我不知道clean()中的比较是否有效(例如,如果form.instance.current_计数,wheterEnvUpdate将重写form\u类(不应该,但我从未尝试过)。您甚至可以移除meta子类,并从EnvUpdate中提供model和{},就像您在上面所做的那样。你可以很容易地尝试一下。在

相关问题 更多 >