2010-08-19 8 views
6

Ich arbeite an einem Django-Projekt, bei dem ich ein Signal implementieren möchte, das aufgerufen werden soll, wenn eine Benutzeradresse geändert wird. Ich habe die eingebauten Signale gesehen, aber sie scheinen in meinem Fall nicht zu funktionieren, denn wenn ich save verwende, wird das auch in anderen Speicher-Events aufgerufen und obwohl ich in der Lage bin, ein benutzerdefiniertes Signal zu erzeugen, konnte ich es nicht herausfinden Wie soll ich das nennen?Erstellen eines Django-Signals für die Aktualisierung von Benutzerdetails

Bitte vorschlagen.

Vielen Dank im Voraus.

Antwort

16

Beginnen Sie mit der Definition eines benutzerdefinierten Signals. Ein benutzerdefiniertes Signal ist hier eine Unterklasse von django.dispatch.Signal. Dieser Code kann in app/signals.py leben.

Als nächstes stellen Sie sicher, dass Sie dieses Signal senden, wenn Ihre Benutzeradresse geändert wird. Je nachdem, wie Sie User und Address definiert haben, kann dies an verschiedenen Stellen geschehen. Nehmen wir an, dass es eine Ansicht gibt, mit der Benutzer ihre Address Modelle aktualisieren können. Dieser Code ist vermutlich in app/views.py.

from app import signals 

def update_address(request, *args, **kwargs): 
    # all the changes go well. 
    signals.user_address_changed.send(sender=None, user=request.user) 
    # Render to template etc. 

Jetzt müssen Sie einen Empfänger für dieses Signal einrichten.

from app.signals import user_address_changed 

def handle_user_address_change(sender, **kwargs): 
    """Trap the signal and do whatever is needed""" 
    user = kwargs['user'] 
    # Write to log, update db, send mail etc. 

user_address_changed.connect(handle_user_address_change) 

aktualisieren

(Nach Kommentar zu lesen, der OP erklärt, dass es keine separate Ansicht ist, dass Updates adressieren) In diesem Fall können Sie versuchen, User.save() außer Kraft zu setzen, dieses Signal auszusenden. Ich sage "versuchen", weil ich nicht weiß, ob Sie Ihre eigene User Klasse oder auth.User verwenden.

+0

Dank für Ihre Antwort manoj, würde dies eine für die Front-End-Benutzer Updates funktionieren. Aber wenn wir die Adresse über das Admin-Panel ändern, wird diese Ansicht nicht aufgerufen und daher wird dieses Signal nicht gesendet. –

+0

Aktualisierte Antwort. Siehe oben. –

+0

ist ein separates Modell mit Benutzer als Fremdschlüssel .. so denke ich User.save() ist in diesem Fall nicht möglich? –

1

Sie können django-signalqueue schätzen:

https://github.com/fish2000/django-signalqueue

Es ist eine Erweiterung des Dispatcher Lager Signal, das eine AsyncSignal Klasse zur Verfügung stellt. AsyncSignal-Callbacks können in einem separaten Worker-Thread ausgeführt werden. Sie können das spezifische Verhalten der von Ihnen definierten asynchronen Listener steuern.

(vollständige Offenlegung. Ich habe es geschrieben)

Verwandte Themen