Локализация 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"
Вернуться на верх