Ini ditambahkan ke dokumentasi ketika Django 1.7 dirilis:
Sebenarnya, penanganan sinyal dan kode registrasi dapat hidup di mana saja Anda suka, meskipun disarankan untuk menghindari modul root aplikasi dan modul modelnya untuk meminimalkan efek samping dari kode impor.
Dalam praktiknya, penangan sinyal biasanya didefinisikan dalam suatu submodul sinyal dari aplikasi yang mereka hubungkan. Penerima sinyal terhubung dalam metode ready () dari kelas konfigurasi aplikasi Anda. Jika Anda menggunakan dekorator penerima (), cukup impor submodule sinyal di dalam ready ().
Diubah dalam Django 1.7: Karena ready () tidak ada di versi sebelumnya Django, pendaftaran sinyal biasanya terjadi dalam modul model.
Praktik terbaik adalah mendefinisikan handler Anda di handlers.py dalam submodule sinyal, misalnya file yang terlihat seperti:
yourapp / signal / handlers.py :
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
pass
Tempat terbaik untuk mendaftarkan pengendali sinyal Anda adalah di AppConfig aplikasi yang mendefinisikannya, menggunakan metode ready () . Ini akan terlihat seperti ini:
yourapp / apps.py :
from django.apps import AppConfig
class TasksConfig(AppConfig):
name = 'tasks'
verbose_name = "Tasks"
def ready(self):
import yourproject.yourapp.signals.handlers #noqa
Pastikan Anda memuat AppConfig dengan menetapkannya secara langsung di pengaturan Anda. INSTALLED_APPS Anda, atau di dalam __init__
aplikasi Anda. Lihat lihat dokumentasi ready () untuk informasi lebih lanjut.
Catatan: Jika Anda juga memberikan sinyal bagi aplikasi lain untuk didengarkan, letakkan di __init__
dalam modul sinyal Anda, misalnya file yang terlihat seperti:
yourapp / signal / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Aplikasi lain kemudian dapat mendengarkan sinyal Anda dengan mengimpor dan mendaftarkannya, mis from yourapp.signals import task_generate_pre_save
. Memisahkan sinyal Anda dari handler Anda menjaga semuanya tetap bersih.
Instruksi untuk Django 1.6:
Jika Anda masih terjebak pada Django 1.6 atau lebih rendah, maka Anda akan melakukan hal yang sama (tentukan handler Anda di yourapp / signal / handlers.py) tetapi alih-alih menggunakan AppConfig, Anda akan memuat handler melalui __init__.py dari aplikasi Anda, mis. sesuatu seperti:
yourapp / __ init__.py
import signals
Ini tidak sebagus menggunakan metode ready () karena sering menyebabkan masalah impor melingkar.