1

models.py

amis Bonne nuit, je voudrais savoir s'il est possible que chaque fois que j'enregistrer un nouveau mouvement, l'administrateur django vérifie ce qui est un « Hydrographique region 'et ajoute la valeur qui est entrée avec la' balance_box '.comment mettre à jour un autre champ admin django

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 

J'ai essayé quelque chose comme cela, créez cette méthode dans le « MovimentoAdmin de classe (admin.ModelAdmin) », mais cela n'a pas fonctionné.

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() 

Est-ce que quelqu'un a une astuce comment je pourrais le faire?

Répondre

0

Semble à moi comme vous avez besoin Django Signals. Vous pouvez enregistrer un écouteur sur le signal post_save pour votre modèle Movement. L'auditeur vérifie alors les changements (il peut également détecter la création d'objet avec le paramètre created) et réagit en conséquence. Cependant, ceci ne s'appliquerait pas seulement à Django Administrator, mais à toutes les positions dans votre code où un objet Movement a été créé. Si vous créez uniquement ces objets via le site d'administration, vous allez bien. Sinon, pensez à remplacer la méthode Django ModelAdmin.save_model: Example in Django documentation. Cette méthode vous permet également de détecter la création d'objets.

Si vous voulez vraiment utiliser la méthode save_formset, vérifiez votre code. update_total_valor est défini et pour la classe Movement et non RegiaoHidrografica selon votre extrait, la méthode admin.py est défini sur Movement (ce qui est bien, mais votre accès à RegiaoHidrografica semble mal à moi, puisque vous essayez d'accéder un nom de classe au lieu de la propriété de modèle).

Je recommande de travailler avec les signaux Django ici, ils fournissent une tonne de confort (mais aussi un compromis: temps de traitement supplémentaire lors de l'enregistrement d'un objet ...