Djoser ändern die E-Mail-Sprache
Gibt es eine Möglichkeit, die in djoser gesendete E-Mail basierend auf der Sprache der Benutzerinstanz zu ändern? Ich habe diese Frage gefunden. Wie gebe ich die Sprache der E-Mail, die ich senden möchte, explizit an? , aber es scheint in der letzten Version von djoser keine Option zu sein, da es nicht mehr Ansichten für jede Aktion gibt (Aktivierung, Passwort zurücksetzen usw.) oder ich nicht herausgefunden habe, wie es funktioniert. Ich habe auch versucht, die UserViewSet-Klasse zu erben und die Übersetzung anzuwenden, aber ich weiß nicht, ob dies der Weg ist und wie alle URLs von djoser angegeben werden.
class UserViewSet(djoser_view.UserViewSet):
def perform_create(self, serializer):
user = serializer.save()
signals.user_registered.send(
sender=self.__class__, user=user, request=self.request
)
context = {"user": user}
to = [get_user_email(user)]
language = user.language or 'en-us'
with translation.override(language):
if settings.SEND_ACTIVATION_EMAIL:
settings.EMAIL.activation(self.request, context).send(to)
elif settings.SEND_CONFIRMATION_EMAIL:
settings.EMAIL.confirmation(self.request, context).send(to)
def perform_update(self, serializer):
super().perform_update(serializer)
user = serializer.instance
language = user.language or 'en-us'
with translation.override(language):
if settings.SEND_ACTIVATION_EMAIL:
context = {"user": user}
to = [get_user_email(user)]
settings.EMAIL.activation(self.request, context).send(to)
@action(["post"], detail=False)
def activation(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.user
user.is_active = True
user.save()
signals.user_activated.send(
sender=self.__class__, user=user, request=self.request
)
language = user.language or 'en-us'
with translation.override(language):
if settings.SEND_CONFIRMATION_EMAIL:
context = {"user": user}
to = [get_user_email(user)]
settings.EMAIL.confirmation(self.request, context).send(to)
return Response(status=status.HTTP_204_NO_CONTENT)
Hat jemand irgendwelche Vorschläge oder hat dies getan?
Antworten
Sicher kannst du!
Sie haben die Aktion, an die die E-Mail gesendet wird, korrekt identifiziert.
@action(["post"], detail=False)
def activation(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.user
user.is_active = True
user.save()
signals.user_activated.send(
sender=self.__class__, user=user, request=self.request
)
if settings.SEND_CONFIRMATION_EMAIL:
context = {"user": user}
to = [get_user_email(user)]
settings.EMAIL.confirmation(self.request, context).send(to)
Nach der Unterklasse können UserViewSetSie also einen Vorlagennamen in activationAktion angeben.
if settings.SEND_CONFIRMATION_EMAIL:
context = {"user": user}
to = [get_user_email(user)]
kwargs = {"request": self.request, "context": context}
if user.country == "Country1":
kwargs["template_name"] = "email/country1/activation.html"
settings.EMAIL.confirmation(**kwargs)).send(to)
Djoser verwendet templated-mailzum Erstellen von E-Mail-Inhalten.
Wie Sie jedoch sehen können, wird die userEntität im Kontext übergeben. Daher würde ich eher empfehlen, Ihre Einstellungen ein wenig zu optimieren und dies in der Klasse zu tun, die für die Generierung dieser E-Mail verantwortlich ist.
in deinem app/email.py
class CountryActivationMail(ActivationEmail):
def __init__(self, **kwargs):
super().__init__(**kwargs)
if self.context.user.country == "Country1":
self.template_name = "email/country1/activation.html"
und stellen Sie die CountryActivationMailDjoser-Einstellungen ein, wie in den Dokumenten erläutert .