python - example - django signals español
django post_save llamada desde el interior del modelo de envío? (1)
Simplemente conecte la señal con sender = Badge después de definir Badge, ejemplo probado:
from django.db import models
from django.db.models import signals
def create_badge(sender, instance, created, **kwargs):
print "Post save emited for", instance
class BadgeCategory(models.Model):
name = models.CharField(max_length=100)
class Badge(models.Model):
name = models.CharField(max_length=16, help_text="Name for Badge")
category = models.ForeignKey(BadgeCategory, help_text="Category for badge")
description = models.CharField(max_length=32, help_text="A brief description")
signals.post_save.connect(create_badge, sender=Badge)
Prueba de shell de sesión:
In [1]: category = BadgeCategory(name=''foo'')
In [2]: category.save()
In [3]: badge = Badge(category=category, name=''bar'', description=''test badge'')
In [4]: badge.save()
Post save emited for Badge object
Tengo un modelo bastante simple que funciona:
class Badge(models.Model):
name = models.CharField(max_length=16, help_text="Name for Badge")
category = models.ForeignKey(BadgeCategory, help_text="Category for badge")
description = models.CharField(max_length=32, help_text="A brief description")
file = models.ImageField(upload_to=format_badge_name)
signals.post_save.connect(create_badge, sender=Badge)
Sé que mi función create_badge en signals.py funciona. Si lo envío sin un valor para el remitente, dice que el remitente es un objeto LogEntry. Deseo / necesito hacer referencia a parte de la información de instancia en el script post_save como se muestra a continuación:
def create_badge(sender, instance, created, **kwargs):
from userinfuser.ui_api import UserInfuser
from django.conf import settings
if created:
api_key = settings.API_KEY
api_email = settings.API_EMAIL
ui = UserInfuser(api_email, api_key)
ui.create_badge(instance.category.name, instance.name, instance.description, instance.file.url)
¿Dónde puedo llamar a mi llamada post_save para que esté al tanto de Badge (supongo que esta es la solución?
Gracias.