2012-12-28 9 views
5

W dokumentacji dla Django, określa, że ​​models.py jest dobrym miejscem, aby znaleźć funkcje zwrotne dla sygnałów (post_save, pre_save, etc).Jak odwołać sygnały poza models.py

Where should this code live?

You can put signal handling and registration code anywhere you like. However, you'll need to make sure that the module it's in gets imported early on so that the signal handling gets registered before any signals need to be sent. This makes your app's models.py a good place to put registration of signal handlers.

source: https://docs.djangoproject.com/en/dev/topics/signals/

Mam jednak znaczną ilość logiki biznesowej, który opiera się na sygnałach i to staje się wyzwaniem, aby wyświetlić je w tym samym pliku, co wszystkich moich modeli.

Chciałbym przenieść je do innego pliku, ale nie wiem, jak i gdzie mogę się do nich odwoływać.

A zatem, biorąc pod uwagę następującą strukturę plików, czy mógłbyś podać przykład, w jaki sposób mogę odwołać się do pliku pomocniczego (lub trzeciorzędnego) zawierającego odpowiednie sygnały?

# models.py located in /myapp/some_installed_app/ 
from django import needed.modules 
... # some reference to signals.py? 

class SomeModel() 
    pass 

# signals.py located in /myapp/some_installed_app/ 
from django import needed.things 
... 

def somefun(sender,**kwargs) 
    pass 

post_save.connect(somefun, sender=SomeModel) 
+1

'z importu sygnałów *' w twoim 'models.py' nie działa? – favoretti

+0

@favoretti Spróbuję teraz. –

+2

Jeśli importujesz sygnały w models.py i modelach w pliku signal.py, może zaistnieć potrzeba użycia określonych instrukcji importu, aby uniknąć importu cyklicznego: 'sygnałów importu' i' modeli importowania', w przeciwieństwie do używania '*' lub i członkowie tego modułu. – jdi

Odpowiedz

7

Co powiecie na "łączenie" sygnałów w models.py przy zachowaniu funkcji w signals.py?


przykład:

# models 
from myapp import signals 
class MyModel(models.Model) 
    pass 
post_save.connect(signals.do_some_stuff_with_mymodel, sender = MyModel) 

# signals 
def do_some_stuff_with_mymodel(**kwargs): 
    pass 

ten sposób nie trzeba importować models w signals w ogóle

+0

Dziękuję za przykład - ma sens i +1 + znacznik wyboru. –

1

Inną opcją byłoby importować sygnały w pliku __init__.py.

Zapewniłoby to wczesną rejestrację i uniknięcie importu okrężnego.