2012-02-12 7 views
2

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

Пример:

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

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

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

+1

что ваш вопрос? – dm03514

+0

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

ответ

4

использование 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 
+0

Это был ответ на мой вопрос :) Функция my_view_wrapper из комментария, который я реализовал как process_template_response() в моем промежуточном программном обеспечении, который затем получает доступ к response.context_data, который имеет нужные мне данные. Благодаря! – garromark

0

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

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

Может быть RequestContext это вещь, которую вы ищете.

+0

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

2

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

# 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() в переменной, а затем получить доступ к Контексту, который вы его передали, но я не знаю, какую проблему вы пытаетесь решить.

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

+0

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