Django — доступ к контекстному словарю перед шаблоном

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

Пример:

def myview(...):
    ...
    return render_to_response('template.html',
        {'variable': variable},
    )

и я хотел бы иметь возможность добавить в контекст дополнительную информацию о существовании «переменной».

Как я могу получить доступ к «переменной» после того, как мое представление определит ее, но до того, как она попадет в шаблон, чтобы я мог дополнительно изменить контекст?


person garromark    schedule 12.02.2012    source источник
comment
Как я могу получить доступ к «переменной» после того, как мое представление определит ее, но до того, как она попадет в шаблон, чтобы я мог дополнительно изменить контекст.   -  person garromark    schedule 12.02.2012


Ответы (3)


используйте TemplateResponse:

from django.template.response import TemplateResponse

def myview(...):
    ...
    return TemplateResponse(request, 'template.html', 
        {'variable': variable},
    )

def my_view_wrapper(...):
    response = my_view(...)
    variable = response.context_data['variable']
    if variable == 'foo':
        response.context_data['variable_is_foo'] = True
    return response
person Mikhail Korobov    schedule 12.02.2012
comment
Это был ответ на мой вопрос :) Функцию my_view_wrapper из комментария я реализовал как process_template_response() в моем промежуточном программном обеспечении, которое затем получает доступ к response.context_data, в котором есть нужные мне данные. Спасибо! - person garromark; 12.02.2012

Это легко. Если вы добавили в свой пример еще немного кода, ответ может вас укусить.

# first build your context, including all of the context_processors in your settings.py
context = RequestContext(request, <some dict values>)
# do something with your Context here
return render_to_response('template.html', context)

Обновить до комментария:

Результатом render_to_response() является объект HTTPResponse, содержащий шаблон, отображаемый в контексте. Этот объект не имеет (насколько мне известно) контекста, связанного с ним. Я полагаю, вы могли бы сохранить результат render_to_response() в переменной, а затем получить доступ к контексту, который вы передали, но я не уверен, какую проблему вы пытаетесь решить.

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

person Peter Rowell    schedule 12.02.2012
comment
Я не понимаю, как мой settings.py будет знать, к какому типу пользователя осуществляется доступ при загрузке страницы. Я хочу, чтобы разная информация загружалась в зависимости от того, к какому типу пользователя осуществляется доступ, однако это универсальное действие, поэтому его не нужно выполнять в каждом представлении. Есть ли способ получить доступ к словарю, сгенерированному контекстом/представлением, ПОСЛЕ вызова render_to_response()? - person garromark; 12.02.2012

Вы можете создать словарь для контекста:

def myview(...):
    c = dict()
    c["variable"] = value
    ...
     do some stuff
    ...
    return render_to_response('template.html',c)

Возможно, RequestContext это то, что вы ищете.

person blacklwhite    schedule 12.02.2012
comment
В промежуточном программном обеспечении process_response я использовал RequestContext(response), и в вашем ответе отсутствовали все переменные, определяемые представлением, например c[variable]. Кроме того, я хочу, чтобы это было автоматизировано за пределами представления, если это возможно, поскольку я буду загружать эти переменные в нескольких местах. Извините, если я не был на 100% ясен :) - person garromark; 12.02.2012