I've run in to the following Django template context processor problem.
The context processor is defined in myapp/context_processors.py
:
def my_context_processor(request):
return {
'foo': 123,
}
It is wired up in settings.py along with the standard Django context processors:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'myproject.myapp.context_processors.my_context_processor',
)
The problem I'm encountering is that my_context_processor is not applied for all requests.
It is not applied for the following code:
def index(request):
return render_to_response("index.html", locals())
However, it is applied for the following code:
def index(request):
return render_to_response("index.html", locals(), context_instance=RequestContext(request))
I was under the impression that context processors are applied for ALL requests, not just when context_instance
is provided.
How do I make my context processors being applied for ALL requests?
context_processors is a list of dotted Python paths to callables that are used to populate the context when a template is rendered with a request. These callables take a request object as their argument and return a dict of items to be merged into the context.
{% %} and {{ }} are part of Django templating language. They are used to pass the variables from views to template. {% %} is basically used when you have an expression and are called tags while {{ }} is used to simply access the variable.
RequestContext adds a bunch of variables to your template context by default – things like the HttpRequest object or information about the currently logged-in user. The render() shortcut creates a RequestContext unless it's passed a different context instance explicitly.
You have answered your own question. It's applied to the responses that use RequestContext
. It's not applied to the ones that don't.
The way to get it to be applied to all responses is to make sure you always use RequestContext. Or, in Django 1.3+, you can use the new render
shortcut instead of render_to_response
, which creates a RequestContext for you.
Django introduced a new render
shortcut in Django 1.3 which automatically includes the RequestContext
from django.shortcuts import render
def my_view(request):
# View code here...
context = {
'some_extra_var_for_template': 'value'
}
return render(request, 'myapp/index.html', context)
You can read about it in the Django docs.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With