您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Django管理中验证依赖内联

在Django管理中验证依赖内联

您可以覆盖内联表单集以实现所需的功能。在表单集的clean方法中,您可以通过“实例”成员访问Shopping实例。因此,您可以使用购物模型暂时存储计算出的总数,并使表单集进行通信。在models.py中:

class Shopping(models.Model):
   shop_name = models.CharField(max_length=200)

   def __init__(self, *args, **kwargs)
       super(Shopping, self).__init__(*args, **kwargs)
       self.__total__ = None

在admin.py中:

from django.forms.models import BaseInlineFormSet
class ItemInlineFormSet(BaseInlineFormSet):
   def clean(self):
      super(ItemInlineFormSet, self).clean()
      total = 0
      for form in self.forms:
         if not form.is_valid():
            return #other errors exist, so don't bother
         if form.cleaned_data and not form.cleaned_data.get('DELETE'):
            total += form.cleaned_data['cost']
      self.instance.__total__ = total


class BuyerInlineFormSet(BaseInlineFormSet):
   def clean(self):
      super(BuyerInlineFormSet, self).clean()
      total = 0
      for form in self.forms:
         if not form.is_valid():
            return #other errors exist, so don't bother
         if form.cleaned_data and not form.cleaned_data.get('DELETE'):
            total += form.cleaned_data['cost']

      #compare only if Item inline forms were clean as well
      if self.instance.__total__ is not None and self.instance.__total__ != total:
         raise ValidationError('Oops!')

class ItemInline(admin.TabularInline):
   model = Item
   formset = ItemInlineFormSet

class BuyerInline(admin.TabularInline):
   model = Buyer
   formset = BuyerInlineFormSet

这是您可以做到的唯一干净方法(据我所知),一切都放置在应有的位置。

添加 if form.cleaned_data 检查,因为表单也包含空内联。请让我知道它如何为您服务!

添加了将要删除的表单的检查,如注释中正确指出的那样。这些表格不应参与计算。

Go 2022/1/1 18:49:56 有340人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶