/ / Senden Sie eine E-Mail an einen Django-Benutzer, wenn dessen aktiver Status geändert wird - Django, Django-Modelle, Django-Benutzer

Senden Sie eine E-Mail an einen Django-Benutzer, wenn dessen aktiver Status geändert wird - Django, Django-Modelle, Django-Benutzer

Ich habe eine Seite erstellt, für die eine Mitgliedschaft erforderlich isteinige Portionen. Es ist eine Club-Website. Um Mitglied auf der Website zu sein, muss man im wirklichen Leben Mitglied sein. Es ist geplant, dass jemand vom Club nach neuen Mitgliedern sucht (ich werde wahrscheinlich vom System eine E-Mail senden lassen, wenn ein Benutzer meldet sich an) und dann überprüft der Administrator die active Kontrollkästchen unter dem Datensatz des Benutzers im Django-Administrator und speichert den Benutzer.

Das Problem, das ich zu überwinden versuche, ist, dass neue, gültige Benutzer benachrichtigt werden müssen, wann sie ihr Konto verwenden können. Das manuelle Senden einer E-Mail ist natürlich umständlich.

Gibt es eine Möglichkeit, sich in die save() Logik, prüfen Sie, ob der Datensatz "s active Status hat sich geändert, und wenn es aktiviert wurde, senden Sie diesem Benutzer eine E-Mail mit der Mitteilung, dass er sich jetzt anmelden kann?

Ich bin auf dem neuesten Stand der E-Mail-Logik, ich muss nur wissen, wo ich sie ablegen soll.

Mir ist klar, dass es andere Möglichkeiten zum Testen gibt (prüfen Sie, ob last_login==None auf active==True Konten bei einem Job im Cron-Stil), aber ich möchte, dass Benachrichtigungen sofort verfügbar sind.

Antworten:

1 für die Antwort № 1

Ja, Sie müssen verwenden Django-Signalespeziell post_save (). Dies wird, wie Sie wahrscheinlich vermutet haben, nach dem Speichern Ihres Modells aufgerufen, und Sie können dann alle erforderlichen Funktionen zum Speichern nach dem Speichern (dh zum Schreiben in die Datenbank) implementieren.


1 für die Antwort № 2

ok 5 Jahre später, aber das funktioniert bei mir mit Django 1.8 und Python 2.7

Der Kontext ist: Wenn der Benutzer ein neues Konto erstellt, erhält der Administrator eine E-Mail, um den Benutzer zu überprüfen, und wechselt zu True, wenn der Administrator die Änderung vornimmt. Der Benutzer erhält eine E-Mail mit der Meldung, dass er sich jetzt anmelden kann.

Entschuldigung für mein schlechtes Englisch.

#forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

#A register form that save field is_active as False
class RegisterForm(UserCreationForm):
email = forms.EmailField(label=_("E-mail"))
first_name = forms.CharField(label=_("First Name"))
last_name = forms.CharField(label=_("Last Name"))
is_active = forms.BooleanField(required=False, initial=False, label=_("Activo"), widget=forms.HiddenInput())

class Meta:
model = User
fields = ("username","first_name","last_name","email","password1","password2","is_active")

def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.first_name = self.cleaned_data["first_name"]
user.last_name = self.cleaned_data["last_name"]
user.email = self.cleaned_data["email"]
user.is_active = self.cleaned_data["is_active"]
if commit:
user.save()
return user

Ich verwende die Signale in der Datei models.py, aber Sie können sie in einer Datei files.py verwenden

#models.py
from django.contrib.auth.models import User
from django.db.models import signals
from django.db import models
from django.dispatch import receiver
from django.db.models.signals import pre_save, post_save
from django.conf import settings
from django.core.mail import send_mail

#signal used for is_active=False to is_active=True
@receiver(pre_save, sender=User, dispatch_uid="active")
def active(sender, instance, **kwargs):
if instance.is_active and User.objects.filter(pk=instance.pk, is_active=False).exists():
subject = "Active account"
mesagge = "%s your account is now active" %(instance.username)
from_email = settings.EMAIL_HOST_USER
send_mail(subject, mesagge, from_email, [instance.email], fail_silently=False)

#signal to send an email to the admin when a user creates a new account
@receiver(post_save, sender=User, dispatch_uid="register")
def register(sender, instance, **kwargs):
if kwargs.get("created", False):
subject = "Verificatión of the %s account" %(instance.username)
mesagge = "here goes your message to the admin"
from_email = settings.EMAIL_HOST_USER
send_mail(subject, mesagge, from_email, [from_email], fail_silently=False)

0 für die Antwort № 3

Dies wurde nicht getestet, aber hier ist eine modifizierte Version von etwas, das ich mache, das ähnlich ist:

from django.contrib.auth.models import User
from django.db.models import signals
from django.conf import settings
from django.core.mail import send_mail

def pre_user_save(sender, instance, *args, **kwargs):
if instance.active != User.objects.get(id=instance.id).active:
send_mail(
subject="Active changed: %s -> %s" % (instance.username, instance.active),
message="Guess who changed active status??",
from_email=settings.SERVER_EMAIL,
recipient_list=[p[1] for p in settings.MANAGERS],
)
signals.pre_save.connect(pre_user_save, sender=User, dispatch_uid="pre_user_save")

Hoffe das hilft!