如何更新admin django上的另一个字段

时间:2017-09-22 02:57:52

标签: django django-models django-forms django-templates django-views

models.py

晚安朋友们,我想知道是否有可能每次我注册一个新的举动,django管理员都会检查什么是水文地区'并使用' balance_box'添加输入的值。

class Movement(models.Model):

    TYPE_MOVE = (
        ('1', 'Receita'),
        ('2', 'Despesa'),
    )

    regiao_hidrografica = models.ForeignKey(RegiaoHidrografica, verbose_name="Região Hidrografica", null=False)
    origem = models.ForeignKey(Origem, verbose_name="Origem", null=False)
    finalidade_recurso = models.ForeignKey(FinalidadeRecursos, verbose_name="Finalidade de Recursos", null=True)
    descricao = models.TextField("Descrição", null=True)
    valor = MoneyField(max_digits=10, decimal_places=2, default_currency='BRL')
    data_refencia = MonthField("Data de Referencia", help_text="Informe mês e ano")
    # data_refencia = models.DateField("Data de Referencia", null=True, blank=True, default=None)
    tipo_movimento = models.CharField(max_length=1, default=1, choices=TYPE_MOVE)
    def __str__(self):
        return self.descricao

    def update_total_valor(self):
        total = 0
        self.movimento_set:
            total += mov.valor
        self.saldo_caixa = total
        self.save()


class RegiaoHidrografica(models.Model):
    name = models.CharField("Nome", max_length=100, null=False)
    sigla = models.CharField("Sigla", max_length=10, null=True)
    taxa_inea = models.IntegerField(default=10, null=True)
    taxa_trans = models.IntegerField(default=0, null=True)
    saldo_caixa = MoneyField('Saldo em caixa estimado', max_digits=10, decimal_places=2, null=True, default=0, default_currency='BRL')
    saldo_cc = MoneyField('Saldo em conta estimado', max_digits=10, decimal_places=2, null=True, default=0, default_currency='BRL') 
    def __str__(self):
        return self.name

我试过类似这样的东西,在<类MovimentoAdmin(admin.ModelAdmin)'中创建这个方法,但它不起作用。

admin.py

def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in instances:
            instance.save()
        formset.save_m2m()
        instance.RegiaoHidrografica.update_total_valor()

有人会暗示我该怎么做吗?

1 个答案:

答案 0 :(得分:0)

听起来像你需要Django Signals

您可以在模型post_save的{​​{1}}信号上注册听众。然后,侦听器将检查更改(它还可以使用参数Movement检测对象创建)并做出相应的反应。

但是,这不仅适用于Django Administrator,而且适用于代码中创建created对象的所有位置。如果您只通过管理站点创建这些对象,则可以。  否则,请考虑覆盖Django Movement方法: Example in Django documentation。此方法还为您提供了检测对象创建的功能。

如果您确实想要使用ModelAdmin.save_model方法,请检查您的代码。根据您的代码段,save_formset在课程update_total_valor中定义而非Movement admin.py 中的方法在RegiaoHidrografica上定义(这很好,但是你对Movement的访问看起来不对,因为你试图访问一个类名而不是模型属性。)

我建议在这里使用Django信号,它们提供了很多的舒适度(但也需要权衡:在保存对象时增加了处理时间......