i have class invoice, (simplified) has following attributes:
class invoice(models.model) number = models.charfield(verbose_name="number", max_length=16) issue_date = models.datetimefield(verbose_name="issue date", default=datetime.now) total = models.floatfield(verbose_name="total", blank=true, null=true) and then, have class invoiceline, represents line/lines invoice can have:
class invoiceline(models.model): invoice = models.foreignkey(invoice, verbose_name="invoice") description = models.charfield(verbose_name="description", max_length=64) line_total = models.floatfield(verbose_name="line total") invoiceline inline of invoice, , want achieve that, when in admin save invoice lines (one ore more) total of invoice calculated. i've tried overriding method save:
class invoice(models.model) number = models.charfield(verbose_name="number", max_length=16) issue_date = models.datetimefield(verbose_name="issue date", default=datetime.now) total = models.floatfield(verbose_name="total", blank=true, null=true) def save(self, *args, **kwargs): invoice_lines = invoiceline.objects.filter(invoice=self.id) self.total = 0 line in invoice_lines: self.total=self.total+line.line_total super(invoice, self).save(*args, **kwargs) the problem when add elements in invoiceline, first time save , functionsave called, new elements in inline (invoiceline) aren't stored yet, when invoiceline.objects.filter(invoice=self.id) , not taken account. so, way works saving twice. i've tried:
def save(self, *args, **kwargs): super(invoice, self).save(*args, **kwargs) invoice_lines = invoiceline.objects.filter(invoice=self.pk) self.total = 0 line in invoice_lines: self.total=self.total+line.line_total super(invoice, self).save(*args, **kwargs) but has same result. idea? in advance!
finally i've found on post change object after saving inlines in django admin has helped me lot. key in admin.py had class invoiceheaderadmin(admin.modeladmin), have had put 3 functions in order modify total attribute after inlines has been saved: way, query invoice_lines = invoiceline.objects.filter(invoice_header=obj.pk) didn't work before, works perfect. tue function invoiceheaderadmin has been follows:
class invoiceheaderadmin(admin.modeladmin): inlines = [invoicelineinline] list_filter = ('format_line','issue_date',) list_display = ('number','organization','issue_date','total',) fields = ('format_line','organization','issue_date',) #the following functions calculating total price of invoice header based on lines def response_add(self, request, new_object): obj = self.after_saving_model_and_related_inlines(new_object) return super(invoiceheaderadmin, self).response_add(request, obj) def response_change(self, request, obj): obj = self.after_saving_model_and_related_inlines(obj) return super(invoiceheaderadmin, self).response_change(request, obj) def after_saving_model_and_related_inlines(self, obj): invoice_lines = invoiceline.objects.filter(invoice_header=obj.pk) obj.total = 0 line in invoice_lines: obj.total=obj.total+line.line_total obj.save() return obj the clue last function, inlines have been saved , can calculate attribute object (invoice) , modify it.
Comments
Post a Comment