Добавление пользовательских переменных в объект запроса в Django Middleware без использования request.session
Есть ли рекомендуемый способ передать переменную во все мои представления? Именно в моем случае я хочу передать объект UserProfile, который Foreign Keys, объекту django.contrib.auth.models.User. Я нахожу большинство, если не все мои представления, нуждающимися в извлечении объекта UserProfile, и размещение его в Middleware кажется правильным решением. Кажется, что я мог бы сделать что-то вроде следующего (я видел несколько решений онлайн, которые предлагают это):
request.session['userprofile'] = userprofile_object
Мне это не нравится, потому что если моя модель UserProfile когда-либо будет иметь несериализуемое поле, это нарушит request.session.
2 ответа
Если у вас есть AuthenticationMiddleware
включен, у вас будет user
объект во всех ваших взглядах. Чтобы получить профиль, все, что вам нужно сделать, это позвонить user.get_profile
по вашему мнению. Например, чтобы вывести идентификатор профиля, вы должны сделать {{ user.get_profile.id }}
,
Если вы предпочитаете не вызывать функцию get_profile пользовательского объекта каждый раз, вы можете добавить произвольные элементы к вашему запросу. Вы бы создали новое промежуточное ПО, которое бы просто
request.user_profile = request.user.get_profile()
Затем просто зарегистрируйте это промежуточное программное обеспечение в вашем файле settings.py, и все будет хорошо. Я использовал этот метод в прошлом для получения пользовательских данных геолокации, прикрепленных к объекту запроса.
Это предложение зависит от предположения, что объекты userprofile имеют значение только тогда, когда пользователи уже вошли в систему, поэтому вы можете войти в систему через пользователя request.user
, Должна быть возможность получить профиль пользователя, переместив отношение внешнего ключа в обратном порядке, например так:
if request.user.is_authenticated():
request.user.userprofile_object_set.all() #gets all related userprofile objects
else:
#...