Шаблон тега и объект запроса - PullRequest
1 голос
/ 28 июня 2011

Каждый раз, когда к моему приложению делается запрос, я использую промежуточное программное обеспечение для извлечения и сохранения объекта «Страница», в котором есть информация, относящаяся к этой конкретной странице.Я храню ссылку на этот объект в объекте запроса, вот пример:

class PageMiddleware(object):
    def process_request(self, request):
        if not hasattr(request, 'page'):
            request.page = Page.objects.get(slug=<slug>)
        return None

Это работает достаточно хорошо, но я хочу получить доступ к этому объекту в теге шаблона.Теги шаблона имеют только ссылку на контекстную мысль, что означает, что я не могу видеть свой объект Page.

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

Короче говоря, я хочу получить доступ к своему объекту Page в теге шаблона в идеале, просто используя промежуточное ПО.Любые идеи?

Редактировать: я использую стандартный тег шаблона со следующим классом:

class GetPageContentNode(Node):
    def __init__(self, key):
        self.key = key

    def render(self, context):
        return context['request'].page

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Посмотрите на это, вы можете получить доступ к объекту запроса (и вашему объекту), передавая take_context при регистрации тега шаблона

Запрос доступа в тегах пользовательских шаблонов django

На этой странице есть поиск по запросу "take_context":

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#registering-the-tag

1 голос
/ 28 июня 2011

Вызовите каждый render_to_response с параметром context_instance , например:

def some_view(request):
    # ...
     return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))

РЕДАКТИРОВАНИЕ, предложенное Daniel Roseman :

Andдобавьте django.core.context_processors.request к TEMPLATE_CONTEXT_PROCESSORS настройкам.

0 голосов
/ 29 декабря 2011

Попробуйте это:

class GetPageContentNode(Node):
    def __init__(self, key):
        self.key = key

    def render(self, context):
        request = template.Variable('request').resolve(context) # here's the magic!
        return request.page
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...