Я пишу пользовательский тег в Django, который должен выводить значение, хранящееся в пользовательском сеансе, но я не могу найти способ доступа к объекту сеанса из пользовательской функции тега. Есть ли способ сделать это, без необходимости вручную назначать объект сеанса переменной контекста?
В Django можно ли получить доступ к текущему сеансу пользователя из пользовательского тега?
Ответ 1
Вы должны иметь возможность добавить обработчик контекста запроса в файл settings.py:
TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request',)
Это будет делать то же самое, что и текущий ответ, без необходимости добавлять пользовательский файл.
Ответ 2
Никакое преступление не предназначалось для Себастьяна, поскольку это похоже на полезный взлом в какой-то момент, но, как ни странно, 24 декабря в блоге о доступе к пользовательским данным в Admin, Джеймс Беннет, менеджер выпуска Django, было сказано: a href= "http://www.b-list.org/weblog/2008/dec/24/admin/" rel= "noreferrer" > об использовании threadlocal hack:
Большой отказ от жира: для этих типов функций есть много и много потенциальных возможностей. Многие из них ошибаются и глупы, и вы не должны их пытаться.... Кроме того, вы будете иногда видеть, что кто-то предполагает, что эти функции могут быть получены с помощью "threadlocal hack"; это в основном связано с вложением request.user в своего рода волшебную глобально доступную переменную и очень плохую вещь для использования, если вы не знаете, что делаете вы. Его также, как правило, очень плохая вещь для использования, даже если вы знаете, что делаете, потому что вы, вероятно, просто делаете это, потому что вы ленивы и не хотите, чтобы вы правильно обменивались информацией. Поэтому, если вы видите, что кто-то предлагает вам сделать это, используя "threadlocal", игнорируйте этого человека.
Не говоря о том, что вы должны игнорировать Себастьяна, но, возможно, стоит использовать другие возможности, а не использовать threadlocal, который не считается лучшей практикой.
Ответ 3
Вы можете сделать это с помощью настраиваемых процессоров контекста (см. http://docs.djangoproject.com/en/dev/ref/templates/api/)
В этом случае вы должны создать новый файл с именем context_processors.py на том же уровне, что и файл settings.py, содержащий:
def add_session(request):
return {'session': request.session}
Затем в файле settings.py добавьте:
TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'context_processors.add_session',)
Теперь вы сможете ссылаться на контекст ['session'] в своем пользовательском теге.
Обратите внимание, что это будет работать только для шаблонов, созданных с помощью назначенного RequestContext, как в следующем коде:
def test(request):
return render_to_response('test.html',{}, context_instance=RequestContext(request))
Ответ 4
Я нашел это полезным: http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser
Вы можете использовать промежуточное программное обеспечение, чтобы получить информацию о пользователе и сохранить его с помощью локального потока, а затем использовать его с определением тега.
Ответ 5
Использование render_to decorator из django-annoying кажется лучшим вариантом (как видно из fooobar.com/info/90906/...)