Добавление пользовательских переменных в объект запроса в Django Middleware без использования request.session - PullRequest
2 голосов
/ 02 марта 2012

Есть ли рекомендуемый способ передачи переменной во все мои представления?Именно в моем случае я хочу передать объект UserProfile, который Foreign Keys, объекту django.contrib.auth.models.User.Я нахожу большинство, если не все мои представления, нуждающимися в извлечении объекта UserProfile, и размещение его в Middleware кажется правильным решением.Кажется, что я мог бы сделать что-то вроде следующего (я видел пару решений онлайн, которые предлагают это):

request.session['userprofile'] = userprofile_object

Мне не нравится это, потому что если моя модель UserProfile когда-либо имеетСериализуемое поле, это нарушит request.session.

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

Если у вас включен AuthenticationMiddleware, у вас будет объект user во всех ваших видах.Чтобы получить профиль, все, что вам нужно сделать, это позвонить user.get_profile на ваш взгляд.Например, чтобы вывести идентификатор профиля, вы должны сделать {{ user.get_profile.id }}.

. Если вы не хотите каждый раз вызывать функцию get_profile объекта пользователя, вы можете добавить в свой запрос произвольные элементы.Вы должны создать новое промежуточное программное обеспечение, которое просто установит

request.user_profile = request.user.get_profile()

Затем просто зарегистрируйте это промежуточное программное обеспечение в вашем файле settings.py, и все будет хорошо.В прошлом я использовал этот метод для получения пользовательских данных геолокации, прикрепленных к объекту запроса.

0 голосов
/ 02 марта 2012

Это предложение зависит от предположения, что объекты userprofile имеют значение только тогда, когда пользователи уже вошли в систему, поэтому вы можете получить зарегистрированного пользователя через request.user.Должна быть возможность получить профиль пользователя, переместив отношение ключ-ключ в обратном порядке, например:

if request.user.is_authenticated():
    request.user.userprofile_object_set.all() #gets all related userprofile objects
else:
   #...
...