首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Djoser更改邮件语言

Djoser更改邮件语言
EN

Stack Overflow用户
提问于 2020-11-01 16:35:59
回答 1查看 208关注 0票数 1

有没有办法根据用户实例的语言更改在djoser中发送的电子邮件?我已经找到了这个问题How do I explicitly specify language of email I want to send?,但它似乎不是一个选项在最新版本的djoser,因为不再有每个操作(激活,重置密码等)的视图。或者我还没有弄清楚它是如何工作的。此外,我还尝试继承UserViewSet类并应用转换,但我不知道这是否是执行此操作的方法,以及如何指定djoser的所有urls。

代码语言:javascript
复制
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)

有没有人有什么建议或者已经这么做了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 19:30:38

你当然可以!

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

代码语言:javascript
复制
    @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操作中提供一个模板名称。

代码语言:javascript
复制
        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

代码语言:javascript
复制
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.的说明在djoser设置中设置CountryActivationMail

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64630025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档