Djoser 이메일 언어 변경

Nov 01 2020

사용자 인스턴스의 언어에 따라 djoser로 전송되는 이메일을 변경하는 방법이 있습니까? 이 질문을 찾았 습니다. 보내려는 이메일의 언어를 어떻게 명시 적으로 지정합니까? ,하지만 djoser의 마지막 버전에서는 더 이상 각 작업 (활성화, 비밀번호 재설정 등)에 대한보기가 없거나 작동 방식을 파악하지 못했기 때문에 옵션이 아닌 것 같습니다. 또한 UserViewSet 클래스를 도입하고 번역을 적용하려고 시도했지만 이것이 수행하는 방법인지 그리고 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__, 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)

누구든지 제안이 있거나 이것을 했습니까?

답변

TomWojcik Dec 02 2020 at 18:30

물론 넌 할 수있어!

메일이 전송되는 조치를 올바르게 식별했습니다.

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

및 설정 CountryActivationMail설명한 바와 같이 조 세르 설정에서 워드 프로세서에서.