晚安朋友们,我想知道是否有可能每次我注册一个新的举动,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)'中创建这个方法,但它不起作用。
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()
有人会暗示我该怎么做吗?
答案 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信号,它们提供了很多的舒适度(但也需要权衡:在保存对象时增加了处理时间......