我使用的是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美元可以买到一瓶rhum,8美元可以买到一瓶伏特加。迈克付15美元,汤姆付3美元。
目标是防止用户用不匹配的金额保存实例:已支付的金额必须与项目成本的总和相同(即10+8=15+3)。
我试过:
这个问题有什么解决办法吗?客户端(javascript/ajax)验证是最简单的吗?
好吧,我有个解决办法。它包括编辑django管理员的代码。
在django/contrib/admin/options.py中,在add_view(第924行)和change_view(第1012行)方法中,找到此部分:
换成
现在在ModelAdmin中,您可以这样做
不过,这与其说是一个恰当的解决方案,倒不如说是一个技巧。有什么改进建议吗?有人认为这应该是django的一个功能请求吗?
你可以重写你的内联表单集来实现你想要的。在表单集的clean方法中,您可以通过“instance”成员访问购物实例。因此,您可以使用购物模型暂时存储计算的总数,并使您的表单集进行通信。在models.py中:
在admin.py中:
这是唯一干净的方法,你可以做它(据我所知),一切都放在它应该在的地方。
编辑:添加了*if form.cleaned_data*检查,因为表单也包含空的内联线。 请让我知道这是怎么为你工作的!
EDIT2:添加了对将要删除的表单的检查,如注释中正确指出的。这些表格不应参与计算。
相关问题 更多 >
编程相关推荐