更新:直接讀取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