Локализация Django использует язык из модели пользователя
Я пытаюсь взять язык пользователя из модели UserProfile. Пользователь выбирает язык в форме, и после этого сайт должен быть переведен на этот язык. Я создал переключатель, который может менять язык, но это не то, что мне нужно, потому что он не взаимодействует с моей моделью. Я знаю, что мне нужно переписать LocaleMiddleware, но я не знаю, как это сделать правильно. Я пробовал некоторые решения из stackoverflow, но они не работают для меня.
Итак, вопрос: что я делаю неправильно? Или, может быть, проблема не в промежуточном ПО, а где-то еще?
Мое промежуточное ПО:
from django.utils import translation
class LocaleMiddleware(object):
"""
This is a very simple middleware that parses a request
and decides what translation object to install in the current
thread context. This allows pages to be dynamically
translated to the language the user desires (if the language
is available, of course).
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
language_code = request.LANGUAGE_CODE
translation.activate(language_code)
response = self.get_response(request)
translation.deactivate()
return response
def process_request(self, request):
language = translation.get_language_from_request(request)
translation.activate(language)
request.LANGUAGE_CODE = translation.get_language()
def process_response(self, request, response):
translation.deactivate()
return response
Моя модель:
from core.settings.base import LANGUAGES, LANGUAGE_CODE
class UserProfile(models.Model):
user = models.OneToOneField(
User, on_delete=models.CASCADE, related_name="user_profile"
)
phone_number = models.CharField(
max_length=16,
blank=True,
null=True,
validators=[
RegexValidator(
regex=r"^\+?1?\d{9,15}$",
message="Phone number must be entered in the format '+123456789'. Up to 15 digits allowed.",
),
],
)
language = models.CharField(
choices=LANGUAGES, default=LANGUAGE_CODE, max_length=10
)
objects = models.Manager()
Наконец-то я нашел ответ.
from django.utils import translation
from django.utils.deprecation import MiddlewareMixin
class CustomLocaleMiddleware(MiddlewareMixin):
def process_request(self, request):
try:
if request.user.is_authenticated:
translation.activate(request.user.user_profile.language)
request.LANGUAGE_CODE = request.user.user_profile.language
except:
request.LANGUAGE_CODE = "en"