【问题标题】:Update parent values in Django admin在 Django admin 中更新父值
【发布时间】:2013-01-19 00:15:11
【问题描述】:

我有两个模型:

class Tickets(models.Model):
   ticketnumber = models.IntegerField()
   total_amount = models.DecimalField()

class TicketItems(models.Model):
   name = models.Charfield(max_length=30)
   ticket = models.ForeignKey(Tickets)
   price = models.DecimalField()
   amount = models.IntergerField()

我有一个内联管理页面,用户可以添加 TicketItems。我如何更新 保存时所有 TicketItems 的模型门票总数(价格 * 金额)?

Django 文档告诉我在 admin.py 中添加这个:

class TicketAdmin(admin.ModelAdmin):
    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in instances:
            instance.user = request.user
            instance.save()
        formset.save_m2m()

我尝试了很多东西,但我无法更新总金额。这是我的 admin.py:

class TicketitemsInline(admin.TabularInline):
    model = Ticketitems

class TicketsAdmin(admin.ModelAdmin):
    inlines = [
        TicketitemsInline,
    ]

    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in instances:
            instance.user = request.user
            instance.save()
            instance.update_total_amount()
        formset.save_m2m()
admin.site.register(Tickets, TicketsAdmin)

【问题讨论】:

    标签: django django-admin formsets


    【解决方案1】:

    Pankaj Singh 在 Django 邮件列表中回答了这个问题

    解决方法如下: 我测试了以下代码,它可以工作。

    模型.py
    from django.db import models
    
    class Ticket(models.Model):
        ticketnumber = models.IntegerField()
        total_amount = models.DecimalField(max_digits=7, decimal_places=2,
    blank=True)
    
        def update_total_amount(self):
            total = 0
            for ti in self.ticketitem_set.all():
                total += ti.price * ti.amount
            self.total_amount = total
            self.save()
    
    class TicketItem(models.Model):
        name = models.CharField(max_length=30)
        ticket = models.ForeignKey(Ticket)
        price = models.DecimalField(max_digits=7, decimal_places=2)
        amount = models.IntegerField()
    
    
    #### admin.py
    from django.contrib import admin
    from tickets.models import Ticket, TicketItem
    
    
    class TicketItemInline(admin.TabularInline):
        model = TicketItem
    
    class TicketAdmin(admin.ModelAdmin):
        inlines = [TicketItemInline,]
    
        def save_formset(self, request, form, formset, change):
            instances = formset.save(commit=False)
            for instance in instances:
                instance.save()
            formset.save_m2m()
            instance.ticket.update_total_amount()
    
    
    admin.site.register(Ticket, TicketAdmin)
    

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 2015-10-09
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2015-03-23
      • 2016-06-05
      相关资源
      最近更新 更多