gpt4 book ai didi

django - 使用内联时如何在 django-admin 中验证两个模型的数据?

转载 作者:行者123 更新时间:2023-12-04 06:20:38 24 4
gpt4 key购买 nike

更新 :直接阅读 django 源代码我得到了一个未记录的缺失部分来解决我的问题。感谢 Brandon 通过给我一个缺失的部分解决了一半的问题。查看我自己的答案以查看我的解决方案(我不想在这里混杂)。

我有以下(简化的)模型:

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, ]

Order的clean方法中的验证不起作用,因为验证发生时没有保存付款(显然它没有保存到数据库中)。

付款内的验证工作正常(如果编辑或添加新付款)。

如果状态为“已付款”或“已发送”,我想验证订单是否已付款,但由于我无法做到,因此采用清洁方法。

我的问题是,如何访问用户在订单表格的内嵌(付款)中输入的“payment.amount”值以完成验证? (在 Order 模型的 clean 方法中考虑 im)

最佳答案

阅读 django 源代码后,我发现 BaseInlineFormSet 的一个属性包含内联的父实例,在我的情况下,是正在编辑的 Order 实例。

Brandon 给了我另一个重要的部分,遍历 BaseInlineFormSet 的 self.forms 以获取每个实例(甚至没有保存或未清理或为空),在我的情况下,每个 Payment Instance 都被编辑。

这是检查状态为“已付款”或“已发送”的订单是否已付款所需的两条信息。迭代表单集的cleaned_data 不会给出订单数据(即,当不更改订单时,仅更改付款时,或者当不添加付款 - 和空付款 - 但更改订单时),这是决定保存如果订单状态不同于 'PAID' 或 'SENT',则该方法被丢弃。

模型保持不变,我只修改了admin.py添加了下一个:

class PaymentInlineFormset(forms.models.BaseInlineFormSet):
def clean(self):
order = None
payment = None

if any(self.errors):
return

# django/forms/models.py Line # 672,674 .. class BaseInlineFormSet(BaseModelFormSet) . Using Django 1.3
order = self.instance

#There should be only one form in the paymentInline (by design), so in the iteration below we end with a valid payment data.
if len(self.forms) > 1:
raise forms.ValidationError(u'Only one payment per order allowed.')
for f in self.forms:
payment = f.save(commit=False)

if payment.amount == None:
payment.amount = 0

if order != None:
if order.status in ['PAID', 'SENT'] and payment.amount <= 0:
raise forms.ValidationError(u'The order with %s status must have an associated payment.'%order.status)

class pymentInline(admin.StackedInline):
model = Payment
max_num = 1
formset = PaymentInlineFormset

class OrderAdmin(admin.ModelAdmin):
inlines = [ paymentInline, ]

admin.site.register(Order, OrderAdmin)
admin.site.register(Payment)

关于django - 使用内联时如何在 django-admin 中验证两个模型的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6628404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com