Djoser更改电子邮件语言

问题描述

是否有一种方法可以根据用户实例的语言更改在djoser中发送的电子邮件?我发现了这个问题How do I explicitly specify language of email I want to send?,但是在上一版本的djoser中似乎不是一个选择,因为不再有每个操作的视图(激活,重置密码等),或者我还没有弄清楚这个怎么运作。另外,我尝试在其中放置U​​serViewSet类并应用翻译,但是我不知道这是否是这样做的方法以及如何指定djoser的所有URL。

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__,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)

有人有建议吗?

解决方法

当然可以!

您正确识别了发送邮件的操作。

    @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)

因此,在继承UserViewSet后,您可以在activation操作中提供模板名称。

        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使用templated-mail创建邮件内容。

但是,正如您所看到的,user实体是在上下文中传递的。因此,我建议您稍微调整一下设置,然后在负责生成此电子邮件的类中进行设置。

在您的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"

并按照in the docs.

的说明在{joer设置中设置CountryActivationMail

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...