Próbuję zrobić coś takiego jak these proposed signal decorators. Oprócz dekoratora, który łączy dekorowaną metodę z sygnałem (z nadawcą sygnału jako argumentem dla dekoratora), chciałbym użyć dekoratora na metodach klasowych.Sygnał Django za pośrednictwem dekoratora na podstawie metody modelowania?
Chciałbym użyć dekorator tak:
class ModelA(Model):
@connect.post_save(ModelB)
@classmethod
def observe_model_b_saved(cls, sender, instance, created, **kwargs):
# do some stuff
pass
Dekorator jest:
from django.db.models import signals
def post_save(sender):
def decorator(view):
signals.post_save.connect(sender=sender, receiver=view)
return view
return decorator
błąd pojawia się, kiedy to zrobić:
File "/Library/Python/2.6/site-packages//lib/python2.6/site-packages/django/dispatch/dispatcher.py", line 78, in connect AssertionError: Signal receivers must be callable.
Chyba problem polega na tym, że @classmethod
zwraca obiekt metody klasy, który nie jest możliwy do wywołania. Nie bardzo rozumiem, jak działa pod maską, ale domyślam się, że obiekt metody klasy nie jest tłumaczony na wywoływany, dopóki nie zostanie uzyskany dostęp z klasy, na przykład ModelA.observe_model_b_saved
. Czy jest jakiś sposób, żebym mógł jednoznacznie zdefiniować moją metodę jako metodę klasy lub instancji w modelu i (2) podłączyć ją do sygnału za pomocą dekoratora bezpośrednio w definicji metody? Dzięki!
Czy to działa, jeśli zamienisz kolejność @klassmethod i @connect? – Wogan
Nie dostaję teraz: "zauważ_model_b_saved() pobiera dokładnie 4 argumenty nie-słów kluczowych (0 podane)". Co to znaczy? –