Djoser thay đổi ngôn ngữ email
Có cách nào để thay đổi email được gửi trong djoser dựa trên ngôn ngữ của cá thể người dùng không? Tôi đã tìm thấy câu hỏi này Làm cách nào để chỉ định rõ ràng ngôn ngữ email tôi muốn gửi? , nhưng nó dường như không phải là một tùy chọn trong phiên bản mới nhất của djoser, vì không còn chế độ xem cho từng hành động (kích hoạt, đặt lại mật khẩu, v.v.) hoặc tôi chưa tìm ra cách hoạt động của nó. Ngoài ra, tôi đã thử chèn lớp UserViewSet và áp dụng bản dịch, nhưng tôi không biết đây có phải là cách thực hiện hay không và cách chỉ định tất cả các url của djoser.
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)
Có ai có bất kỳ đề xuất hoặc đã làm điều này?
Trả lời
Chắc chắn bạn có thể!
Bạn đã xác định chính xác hành động gửi thư.
@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)
Vì vậy, sau khi phân lớp, UserViewSetbạn có thể cung cấp tên mẫu đang activationhoạt động.
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 đang sử dụng templated-mailđể tạo nội dung thư.
Tuy nhiên, như bạn có thể thấy, userthực thể được chuyển trong ngữ cảnh. Vì vậy, tôi khuyên bạn nên chỉnh sửa cài đặt của bạn một chút và thực hiện nó trong lớp chịu trách nhiệm tạo email này.
trong của bạn 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"
và đặt CountryActivationMailtrong cài đặt djoser như được giải thích trong tài liệu.