Rem*_*ems 14 python django django-admin
我正在使用Django 1.4,我想设置验证规则来比较不同内联的值.
我有三个简单的课程
在models.py中:
class Shopping(models.Model):
    shop_name = models.CharField(max_length=200)
class Item(models.Model):
    item_name = models.CharField(max_length=200)
    cost = models.IntegerField()
    item_shop = models.ForeignKey(Shopping)
class Buyer(models.Model):
    buyer_name = models.CharField(max_length=200)
    amount = models.IntegerField()
    buyer_shop = models.ForeignKey(Shopping)
在admin.py中:
class ItemInline(admin.TabularInline):
    model = Item
class BuyerInline(admin.TabularInline):
    model = Buyer
class ShoppingAdmin(admin.ModelAdmin):
    inlines = (ItemInline, BuyerInline)
因此,例如,可以以10美元购买一瓶朗姆酒,以8美元购买伏特加酒.迈克支付15美元,汤姆支付3美元.
目标是防止用户使用不匹配的金额保存实例:已支付的金额必须与项目成本的总和相同(即10 + 8 = 15 + 3).
我试过了:
有没有解决这个问题的方法?客户端(javascript/ajax)验证最简单吗?
ppe*_*rid 26
您可以覆盖您的内联formset以实现您想要的.在formset的clean方法中,您可以通过"instance"成员访问Shopping实例.因此,您可以使用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*检查,因为表单也包含空内联.请告诉我这对您有何帮助!
EDIT2:添加了对要删除的表单的检查,正如评论中正确指出的那样.这些表格不应参与计算.
| 归档时间: | 
 | 
| 查看次数: | 6588 次 | 
| 最近记录: |