Django-Signale sind ein Aspekt des Django-Frameworks, der es Ihnen ermöglicht, bestimmte Aktionen in Reaktion auf bestimmte Ereignisse auszulösen. Diese Ereignisse können z.B. das Speichern oder Löschen eines Objekts, die Anmeldung oder Abmeldung eines Benutzers sein. Signale ermöglichen es Ihnen, diese Ereignisse zu “abonnieren” und auf sie zu reagieren, ohne dass Sie Ihren Code in die Django-Quellcode implementieren müssen (Quelle: Django Dokumentation, Kapitel “Signale”).
Ein typisches Beispiel für die Verwendung von Signalen ist das Aktualisieren eines Profils, wenn ein Benutzerkonto erstellt wird. Django enthält vordefinierte Signale wie `post_save` und `pre_save` für Modelle, die ausgeführt werden, bevor bzw. nachdem ein Modell gespeichert wird (Quelle: Django Dokumentation, Kapitel “Signalbeispiele”). In diesem Fall können Sie ein Signal verwenden, um ein Profil zu erstellen, wenn ein Benutzerkonto erstellt wird.
Zunächst müssen Sie das Signal importieren:
```python
from django.db.models.signals import post_save
```
Dann definieren Sie eine Funktion, die aufgerufen wird, wenn das Signal ausgelöst wird:
```python
from django.dispatch import receiver
from my_app.models import User, Profile
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
```
In diesem Code wird das `post_save` Signal abonniert. Der Decorator `@receiver` legt fest, dass die Funktion `create_user_profile` aufgerufen wird, wenn ein User-Objekt gespeichert wird. Wenn das User-Objekt gerade erstellt wurde (`if created:`), wird ein neues Profile-Objekt für diesen User erstellt.
Die Definition dieser Funktion muss in einem Modul sein, das beim Starten der Django-Anwendung geladen wird, wie z.B. in einer models.py-Datei.
Beachte, dass es möglich ist, mehrere Funktionen auf dasselbe Signal zu abonnieren, und es ist auch möglich, eine Funktion auf mehrere Signale zu abonnieren.
Django-Signale können eine nützliche Methode sein, um Ihr Programm modularer und reaktionsfähiger zu machen. Sie bieten eine übersichtliche Möglichkeit, auf Ereignisse in Ihrer Anwendung zu reagieren, ohne Ihren Code in verschiedene Teile Ihres Projekts streuen zu müssen.
Quellen:
“Django Dokumentation, Kapitel ‘Signale’” (https://docs.djangoproject.com/en/3.1/topics/signals/)
“Django Dokumentation, Kapitel ‘Signalbeispiele’” (https://docs.djangoproject.com/en/3.1/ref/signals/#django.db.models.signals.post_save)