【问题标题】:How to access all forms from a save_related formsets in django modelAdmin如何从 django modelAdmin 中的 save_related 表单集中访问所有表单
【发布时间】:2014-12-10 05:01:09
【问题描述】:

调用 save_related 时,我需要访问内联表单集中所有表单的两个字段,并且 save_related 让我只能访问更改后的表单/数据。

我的问题的任何其他解决方案都可以,所以这里是:

class Invoice(models.Model):
    invoice = models.CharField(max_length=10, blank=True, null=True, unique=True)
    total = models.PositiveIntegerField(blank=True, null=True)


class InvoiceItem(models.Model):
    invoice = models.ForeignKey(Invoice, related_name='items')
    service = models.ForeignKey(Service)
    quantity = models.PositiveIntegerField(blank=False, default=1)
    price = models.PositiveIntegerField(blank=False, default=0)


class InvoiceItemInline(admin.TabularInline):
    model = InvoiceItem


class InvoiceAdmin(admin.ModelAdmin):
    inlines = [InvoiceItemInline]

    def save_related(self, request, form, formsets, change):
        invoice = form.instance
        invoice.total = 0
        for inlines in formsets:
            for inline_form in inlines:
                invoice.total = invoice.total + inline_form.cleaned_data['price'] * inline_form.cleaned_data['quantity']
        invoice.save()
        super(InvoiceAdmin, self).save_related(request, form, formsets, change)

我需要计算每个发票项目的发票总额,其中每个项目都有数量 * 价格。

【问题讨论】:

    标签: django-admin modeladmin


    【解决方案1】:

    解决您的解决方案。这个对我有用。刚刚将inline_form.cleaned_data['price'] 更改为inline_form.cleaned_data.get('price')。 :)

    class InvoiceAdmin(admin.ModelAdmin):
        inlines = [InvoiceItemInline]
    
        def save_related(self, request, form, formsets, change):
            invoice = form.instance
            invoice.total = 0
            for inlines in formsets:
                for inline_form in inlines:
                    invoice.total = invoice.total + inline_form.cleaned_data.get('price') * inline_form.cleaned_data.get('quantity')
            invoice.save()
            super(InvoiceAdmin, self).save_related(request, form, formsets, change)
    

    【讨论】:

      【解决方案2】:

      我找不到解决方案,所以我保存了相关数据并使用查询集来获取保存的数据,以便我可以进行计算并再次保存。 我想有人会称之为“一种解决方法”:)

      def save_related(self, request, form, formsets, change):
          super(InvoiceAdmin, self).save_related(request, form, formsets, change)
          invoice = form.instance
          invoice.total = 0
          for item in Invoice.objects.get(pk=invoice.id).items.all():
              invoice.total = invoice.total + item.quantity * item.price
          invoice.save()
      

      【讨论】:

        猜你喜欢
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 2013-08-24
        • 2011-04-16
        相关资源
        最近更新 更多