Добавление пользовательских переменных в объект запроса в 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:
   #...
Другие вопросы по тегам