J'essaie de faire en sorte que le champ 'num_posts' d'un objet blog soit décrémenté chaque fois qu'un article appartenant à ce blog est supprimé, et incrémenté chaque fois qu'un post est créé. Je suis en mesure de mettre en œuvre la méthode surchargée Suffisamment facilement:Le gestionnaire de signal django post_delete() ne fonctionne pas
def save(self, *args, **kwargs):
'''After saving a new post, increment the num_posts value in the
relevant blog.'''
super(Posts, self).save(*args, **kwargs)
self.blog_id.num_posts += 1
tmp = self.blog_id
tmp.save()
Mais pour une raison quelconque, la logique ne fonctionne pas lors de la suppression d'un objet Messages. Je suis les meilleures pratiques en utilisant des gestionnaires de signal dans un fichier handlers.py
dans un sous-module de signaux. Je puis importer le sous-module dans ma méthode ready()
dans ma méthode TasksConfig(Appconfig)
dans apps.py
Je ne semble pas être obtenir des erreurs de syntaxe ou toute erreur du tout. Le champ num_posts
sur le blog concerné ne parvient tout simplement pas à décrémenter. Voici le code correspondant:
De mon handlers.py
:
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from webcomics.models import Pages, Posts, Blogs
@receiver(pre_delete, sender=Pages)
def handle_page_delete(sender, **kwargs):
obj = kwargs['instance']
if(obj != None):
tmp1 = obj.prev_id
tmp2 = obj.next_id
if(tmp1 != None):
tmp1.next_id = tmp2
obj.prev_id = None
if(tmp2 != None):
tmp2.prev_id = tmp1
obj.next_id = None
@receiver(pre_delete, sender=Posts)
def handle_bpost_delete(sender, **kwargs):
obj = kwargs['instance']
if(obj != None):
tmp = Blogs.objects.get(pk = obj.blog_id)
tmp.num_pages = tmp.num_pages - 1
De mon apps.py
:
from django.apps import AppConfig
class WebcomicsConfig(AppConfig):
name = 'webcomics'
class TasksConfig(AppConfig):
name = 'tasks'
verbose_name = "Tasks"
def ready(self):
import binshellpress.webcomics.signals.handlers
De plus, voici les postes à plein objet dans models.py
, juste au cas où vous les gars peuvent voir quelque chose qui me manque:
class Posts(models.Model):
title = models.CharField(max_length=180)
pub_date = models.DateTimeField('date publishied', default=timezone.now)
blog_id = models.ForeignKey('Blogs', on_delete=models.CASCADE)
series_id = models.ForeignKey('Series', on_delete=models.SET_NULL,
blank=True, null=True)
# Note: Vanilla TinyMCE Integration seems to be working. Need to
# modify the implementation to handle links, images, etc.
data = HTMLField()
def __str__(self):
return self.title
def save(self, *args, **kwargs):
'''After saving a new post, increment the num_posts value in the
relevant blog.'''
super(Posts, self).save(*args, **kwargs)
self.blog_id.num_posts += 1
tmp = self.blog_id
tmp.save()
Je pense que c'est quelque chose d'évident. Je suis juste à perte parce qu'il ne semble y avoir aucun message d'erreur venant de n'importe où.
Pourquoi le test êtes-vous si 'kwargs [ "instance"] == none'? Les signaux 'pre_delete' passent toujours une instance, ou il y a quelque chose qui ne va pas. Et 'Blogs.num_posts' peut être défini simplement comme une propriété qui renvoie' self.pages_set.count() '. Ce serait beaucoup moins sujette aux erreurs que d'ajouter et de soustraire manuellement. –