Я пишу приложение, в котором доступны два языка (английский sh и испанский sh). Я решил решить эту проблему, используя методы для каждой метки, которые я буду отображать в шаблонах, например:
constants.py:
def c_accept(language):
if language == 0:
return 'Aceptar'
elif language == 1 or language is None:
return 'Accept'
def c_welcome_back(language):
if language == 0:
return 'Bienvenido otra vez'
elif language == 1 or language is None:
return 'Welcome back'
Таким образом, я могу используйте c_accept вместо литералов String, передавая язык, который выбрал пользователь (сохраненный в request.session ['language']).
Пока все хорошо, пока я не обнаружил, что у меня слишком много "констант", и это приносит проблему. Если я передам все константы в каждом представлении, это будет много мусора для каждого запроса, и если я передам только те «константы», которые я буду использовать в этом представлении, потребуется много времени, чтобы быть внимательным, какая константа I пользуюсь а какой нет. Поэтому я понял, что могу создать промежуточное ПО, которое загружает все моих констант, но только один раз , как документация Django объясняет в промежуточном программном обеспечении на основе классов:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization. **(I want to load all my constants here)**
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called. **(And then passing this dictionary already initialized).**
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
Но я не могу добиться этого. До сих пор я пробовал что-то вроде этого:
middleware.py:
from .constants import *
class Constants:
const = {}
def __init__(self, get_response, language):
self.get_response = get_response
self.const = {
'c_accept': c_accept(language),
**all my other constants
}
def __call__(self, request):
return self.const
Как я мог сделать что-то подобное? Я пока не понимаю, как обращаться с таким промежуточным ПО (это первое, что я делаю).