2015-07-16 2 views
2

J'essaie de créer un signal simple qui imprime quelque chose après qu'un nouvel objet du modèle Staff soit enregistré dans l'admin Django. Les fichiers MVC python résident dans AppName. Voici le code dans chaque fichier:TypeError: connect() a un argument mot-clé inattendu 'signal' - Django signale

models.py

from django.db import models 
from django.db.models import signals 
from django.dispatch import Signal 
from django.contrib.auth.models import User 
from AppName.signals import printfunction 
from django.db.models.signals import post_save 


class Staff(User): 
    class Meta: 
     proxy = True 
     app_label = 'auth' 
     verbose_name_plural = 'Users - Staff' 

Signal.connect(printfunction, signal=signals.post_save, sender=Staff) 

signals.py

def printfunction(sender, instance, signal, *args, **kwargs): 
    print ("signal alpha!") 

Cependant, il soulève l'exception suivante: TypeError: connect() got an unexpected keyword argument 'signal'

J'ai suivi le 1.8 django documentation on signals. Pourquoi cette erreur se produit-elle et comment y remédier?

+0

voir la documentation à nouveau .. syntaxe doesnot avoir un arguement 'signal': signal. connect (receiver [, expéditeur = None, weak = True, dispatch_uid = None]) –

+0

Oui, la virgule et le '[' ont donné une erreur quand j'ai essayé, donc je suis retourné à la syntaxe de dispatcher pour Signal –

+0

alors ça marche maintenant/? –

Répondre

2
Signal.connect(receiver[, sender=None, weak=True, dispatch_uid=None]) 

Ceci est une notation très courante pour la documentation. Ce n'est pas un code littéral qui peut être utilisé tel quel. Les arguments entre [ et ] sont facultatifs. Si vous les omettez, ils utiliseront les valeurs par défaut. connect est une méthode de la classe Signal. Sauf indication contraire, vous pouvez supposer qu'il s'agit d'une méthode d'instance. Au lieu d'appeler littéralement Signal.connect(), vous devez appeler signal_instance.connect(), où signal_instance est bien sûr une instance de la classe Signal. Dans ce cas, signals.post_save est une instance de Signal, et c'est l'instance à laquelle vous souhaitez connecter votre fonction. L'argument receiver est requis, et dans ce cas c'est votre fonction printfunction. sender, weak et dispatch_uid sont tous facultatifs. Dans votre exemple, vous ne passez que Staff comme sender et vous laissez les autres arguments comme valeurs par défaut. Ainsi, votre appel de fonction finale devrait ressembler à ceci:

signals.post_save.connect(printfunction, sender=Staff) 
+0

Cela a éclairci beaucoup, merci! –

1

Voilà c'est la bonne façon de le faire:

@receiver(post_save, sender=Staff) 
def printfunction(sender, instance, signal, *args, **kwargs): 
    print ("signal alpha!")