В Django действительно ли возможно получить доступ к текущему сеансу пользователя из пользовательского тега?

Я обновляю ответ @Zohar. Определить пробел - это плохие привычки, в идеале определить с нулевым, а затем использовать пробел. Таким образом, запрос будет

CREATE PROCEDURE spTest
    @Name varchar(20) = null,
    @Address varchar(100) = null,
    @City varchar(50) = null,
    @Pin varchar(50) = null
AS
    SELECT * 
    FROM Test_Table 
    WHERE (Name = ISNULL(@Name,'') )
    AND (Address = ISNULL(@Address,''))
    AND (City = ISNULL(@City,''))
    AND (Pin = ISNULL(@Pin,''));
GO

Даже мне нравится ответ @Biswa, поскольку он использует текущую версию SQL-сервера, но Sqlserver 2008R2 не имеет этой функции.

23
задан knabar 2 December 2008 в 20:01
поделиться

5 ответов

Необходимо быть в состоянии добавить процессор контекста запроса в 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',)

Это сделает то же самое как текущий ответ, не имея необходимость добавлять пользовательский файл.

23
ответ дан Paco 29 November 2019 в 02:28
поделиться

Никакое преступление не предназначило Sebastian, поскольку это кажется, что был полезный взлом однажды, но достаточно странно 24 декабря в записи в блоге о данных зарегистрированного пользователя в Администраторе, James Bennett, менеджер по релизам Django, сказал следующее об использовании взлома threadlocal :

А большая правовая оговорка: существуют партии и большое потенциальное использование для этих типов функций. Многие из них неправы и глупы и Вы shouldn’t судить их.... Кроме того, Вы будете иногда видеть, что кто-то предполагает, что эти функции могут быть получены what’s, известным как "threadlocal взлом"; это в основном включает липкий request.user в своего рода волшебную глобально доступную переменную и является Очень Плохой Вещью использовать, если Вы don’t знаете что выполнение you’re. It’s также обычно Очень Плохая Вещь использовать, даже если Вы действительно знаете, какое выполнение you’re, с тех пор you’re, вероятно, просто выполнение его, потому что you’re ленивый и don’t испытывают желание гарантировать Вам, раздает информацию правильно. Таким образом, если Вы видите, что кто-то предлагает, чтобы Вы сделали это использование "threadlocal", проигнорируйте того человека.

Не высказывание, что необходимо проигнорировать Sebastian, но это могло бы быть стоящее преследование других проспектов вместо того, чтобы использовать threadlocal, который не считают лучшей практикой.

6
ответ дан 29 November 2019 в 02:28
поделиться

Можно сделать это с пользовательскими процессорами контекста (см. 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',)

Вы теперь будете в состоянии обратиться к контексту ['сессия'] в Вашем пользовательском теге.

Примечание, что это будет только работать на шаблоны, представленные с присвоенным RequestContext, как в следующем коде:

def test(request):
    return render_to_response('test.html',{}, context_instance=RequestContext(request))
4
ответ дан Matthew Christensen 29 November 2019 в 02:28
поделиться

Я нашел это полезным: http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

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

0
ответ дан 29 November 2019 в 02:28
поделиться

Использование Декоратор render_to из раздражает django кажется лучшим вариантом (как видно в , другой вопрос о stackoverflow )

0
ответ дан 29 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: