2015-09-02 2 views
0

Джанго версия 1,8Django - Почему context.get ('request') возвращает значение None?

@register.simple_tag(takes_context=True) 
def current(context, url_name): 
    print(context) 
    print(context.get('request')) 

    current_path = context.get('request').path 

    return 'active' if current_path.startswith(url_name) else '' 


>>> [{'True': True, 'False': False, 'None': None}, {'csrf_token': <django.utils.functional.lazy.<locals>.__proxy__ object at 0x7f61d288b860>, 'links': OrderedDict([('index', 'home'), ('products', 'prodotti'), ('contact_us', 'contattaci')])}, {'forloop': {'counter0': 2, 'revcounter': 1, 'revcounter0': 0, 'counter': 3, 'parentloop': {}, 'last': True, 'first': False}}, {'name': 'contattaci', 'key': 'contact_us'}] 
>>> None 

Реакция второй печати не является на самом деле ни один, но я не могу понять причину. Похоже, что объект «запрос» не существует или вообще недоступен.

Это интересующая деталь в файле settings.py.

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 
+0

Первая печать соответствует 'print (context)'? – Gocht

+0

@Gocht Ya, было довольно ясно .. –

+0

Если это так, вы должны получить 'AttributeError', потому что в« списке »нет метода' get'. И, как видите, 'print (context)' печатает 'list'. – Gocht

ответ

1

Запроса и другие значения из контекста процессоров отсутствуют из контекста.

Запрос по-прежнему доступен в качестве атрибута на RequestContext. Вы можете получить к нему доступ с помощью context.request.

+0

OP имеет процессор запросов 'request', поэтому' запрос' должен быть в словаре контекста. – Alasdair

0

Контекстные процессоры, выполняемые непосредственно перед визуализацией шаблона, то есть недоступны, откуда вы используете этот код. Передайте контекст шаблону и напечатайте {{request}} где-нибудь, и вы увидите объект HttpRequest.

https://docs.djangoproject.com/en/1.8/ref/templates/api/#

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

https://docs.djangoproject.com/en/1.8/topics/http/views/

+0

Я довольно уверен в этом. Вы можете легко протестировать его. Кто-то, пожалуйста, поправьте меня, если я ошибаюсь здесь. – Mothbawls

+0

Правильно, запрос передается в шаблон, поэтому вы можете распечатать его там. – Gocht

+0

Что вы имеете в виду, передавая контекст? return render (request, 'foo.html', {'request': request}) что-то вроде этого? –

0

Дополняя @Mothbawls ответ, если вам нужно PRE_PROCESS запрос или context_data, вы могли бы использовать request_process или process_template_response промежуточное программное обеспечение.

0

дополнение Также @Mothbawls ответов, для ОЦК-х, я использую следующие подмешать передать в запросе к контексту шаблона:

class RequestMixin(object): 
    """ Generic mixin to pass request data into context. """ 
    def get_context_data(self, **kwargs): 
     context = super(RequestMixin, self).get_context_data(**kwargs) 
     context['request'] = self.request 
     return context 
+0

Это не сработает, потому что я не могу получить доступ к объекту запроса! Это проблема. –

+0

Объект 'request' по умолчанию не передается в' контексте'. Единственный способ передать объект 'request' в' context' - это сделать изнутри Django View. Я предполагаю, что ваш Django View имеет объект 'request' ... –

+0

Если ваш Django View не имеет' request', тогда возникают другие проблемы. И вам может потребоваться опубликовать ваши views.py и urls.py. –

Смежные вопросы