【问题标题】:Django form field different clean logic based on UpdateView or CreateView基于 UpdateView 或 CreateView 的 Django 表单字段不同的清理逻辑
【发布时间】:2021-09-15 20:40:03
【问题描述】:

我在 Django 中有一个用于 CreateView 和 UpdateView 的表单。其中一个字段是 hours_allocated,它不能是

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 django-views django-forms django-class-based-views


【解决方案1】:

我不是 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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2017-11-07
      相关资源
      最近更新 更多