更新:直接读取django源代码,我得到了一个无证失踪的部分来解决我的问题。感谢布兰登通过给我一件缺失的东西解决了一半的问题。看到我自己的答案,看看我的解决方案(我不想在这里混合的东西)。如何使用内联验证django-admin中两个模型的数据?
我有以下的(简化)型号:
Order(models.Model):
status = models.CharField(max_length=25, choices=STATUS_CHOICES, default='PENDING')
total = models.DecimalField(max_digits=22, decimal_places=2)
def clean(self):
if self.estatus == 'PAID' or self.estatus == 'SENT':
if len(self.payment.all()) > 0:
raise ValidationError("The status cannot be SENT or PAID if there is no payment for the order")
Payment(models.Model):
amount = models.DecimalField(max_digits=22, decimal_places=2)
order = models.ForeignKey(Order, related_name="payment")
def clean(self):
if self.amount < self.order.total or self.amount <= 0:
ValidationError("The payment cannot be less than the order total")
在我的admin.py我有:
class paymentInline(admin.StackedInline):
model = Payment
max_num = 1
class OrderAdmin(admin.ModelAdmin):
model = Order
inlines = [ paymentInline, ]
在订单的清洁方法验证不起作用,因为有验证发生时没有保存付款(显然它没有保存到数据库)。
付款内的验证工作正常(如果编辑或添加新的付款)。
我想验证订单是否有付款,如果状态是'PAID'或'SENT',但因为我不能这样做是在干净的方法。
我的问题是,如何访问用户在订单表单的内联(付款)中输入的'payment.amount'值,以完成我的验证? (在订单模式的清洁方法,考虑到IM)
我只需要requiere的内联有效的formset当订单的状态是“付费”或'SENT'。其他任何状态都可以让用户保存没有内嵌数据的模型(空的数据)。问题是如何从每个模型表单(正在编辑的主模型和内联表单)访问这些字段(数据)以进行比较。 – automatito
应该可以获取对内联关联的父对象的引用。我明天会看看我能否为你准备好样品。 – Brandon
我添加了一个显示可能适合您的自定义内联窗体集的编辑。 – Brandon