基于 UpdateView 或 CreateView 的 Django 表单字段不同的清理逻辑

Django form field different clean logic based on UpdateView or CreateView

我在 Django 中有一个用于 CreateView 和 UpdateView 的表单。其中一个字段是 hours_allocated,它不能 < 0。在我的模型中,我将其声明为:

hours_allocated= models.DecimalField(max_digits=10, decimal_places=2, validators=[MinValueValidator(Decimal('0.0')), MaxValueValidator(Decimal('24.00'))])

更新记录 (UpdateView) 时,这很好。但是,在 CreateView 中,我想确保该值 > 0(不是 UpdateView 中允许的 = 0.0)。如果我添加一个 clean_hours_allocated() 方法来检查值是否 > 0,它适用于 CreateView 和 UpdateView。

有没有办法根据表单是在 UpdateView 还是 CreateView 中使用而在表单级别进行不同的验证?或者,有没有办法在视图本身中正确处理验证?

我不是 Django 专家。但是,我认为您可以在 forms.py.

中执行类似的操作
def clean_hours_allocated(self):
    if not self.instance.pk: # Update instances have a pk and wouldn't go in this.
        ## Logic to validate Create Instances

    return hours_allocated

我认为这不是完美的解决方案,但我相信这应该可以完成您的任务。

我相信一种方法是在您的表单中添加一个隐藏字段,称为 mode,它必须是 {'create', 'update'} 之一。然后根据实例化表单的视图适当地设置此字段的值。

设置好后,您可以在所需的验证方法中检查 cleaned_data['mode'](有关选项的详细说明,请参阅 Django 的 docs)。根据其值,if-else 分支将允许您以不同方式应用验证逻辑