Получить текущий запрос из RequestContext?

#django

#django

Вопрос:

Есть ли у Django RequestContext способ получить HttpRequest объект, с которым он связан? Есть ли у него метод, подобный get_request() или подобный, для получения того request , который передается в конструктор? Мне нужно ссылаться на него из метода, в котором я получаю только RequestContext .

Комментарии:

1. Немного опоздал на вечеринку, и это связано с оговоркой о том, что я только сейчас вхожу в Django, но когда вы передаете аргумент dict RequestContext , вы потенциально можете добавить 'request': request , а затем извлечь его с помощью context.get(‘request’) . На самом деле это кажется неправильным, и для его передачи вам потребуется изменить свои представления, но если вам это действительно нужно, вы можете это сделать. Кроме того, если вы найдете другой (лучший) способ, пожалуйста, обновите. 🙂

Ответ №1:

Добавить 'django.core.context_processors.request' в TEMPLATE_CONTEXT_PROCESSORS настройки. И получить запрос, где контекст доступен с помощью :

 request = context['request']
  

Комментарии:

1. Спасибо! (Мне нужно ввести 15 символов: p)

Ответ №2:

Нет, django.template.RequestContext (который находится в django/template/context.py ) не хранит никаких ссылок на объект запроса:

 class RequestContext(Context):
    """
    This subclass of template.Context automatically populates itself using
    the processors defined in TEMPLATE_CONTEXT_PROCESSORS.
    Additional processors can be specified as a list of callables
    using the "processors" keyword argument.
    """
    def __init__(self, request, dict=None, processors=None, current_app=None, use_l10n=None):
        Context.__init__(self, dict, current_app=current_app, use_l10n=use_l10n)
        if processors is None:
            processors = ()
        else:
            processors = tuple(processors)
        for processor in get_standard_processors()   processors:
            self.update(processor(request))
  

Если Django был исправлен, чтобы включить в конструктор простую строку, подобную этой:

 self.request = request
  

и определение функции, подобное этому:

 def get_request(self):
     return self.request
  

тогда мы были бы в деле. К сожалению, это не так, поэтому ответ: «Нет, вы не можете получить объект запроса, связанный с a RequestContext » .

Комментарии:

1. Только для читателей, которые наткнулись на это в 2014 году, таких как я: ответ Хансона правильный, принятый ответ неверный. Просто добавьте django.core.context_processors.request в TEMPLATE_CONTEXT_PROCESSORS.

2. @Bunkerbewohner Я приму его ответ выше, так как мой устарел. Этот вопрос был первоначально задан в 2011 году, и с тех пор Django изменился.