I would like to know how to pass a variable to all my templates, without repeating the same code on every method in my views.py file?
In the example below I would like to make categories (an array of category objects) available to all templates in the web app.
Eg: I would like to avoid writing 'categories':categories on every method. Is it possible?
One view method
def front_page(request): categories = Category.objects.all() if is_logged_in(request) is False: return render_to_response('users/signup.html', {'is_logged_in': is_logged_in(request), 'categories':categories}, context_instance=RequestContext(request)) else: return render_to_response('users/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))
Another view method
def another_view_method(request): categories = Category.objects.all() return render_to_response('eg/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))
How do you pass a Python variable to a template? And this is rather simple, because Django has built-in template modules that makes a transfer easy. Basically you just take the variable from views.py and enclose it within curly braces {{ }} in the template file.
There are tricks like the one described by John; however, Django's template language by design does not support setting a variable (see the "Philosophy" box in Django documentation for templates). Because of this, the recommended way to change any variable is via touching the Python code.
"Django provides access to certain, frequently-used settings constants to the template such as settings.
What you want is a context processor, and it's very easy to create one. Assuming you have an app named custom_app
, follow the next steps:
custom_app
to INSTALLED_APPS
in settings.py
(you've done it already, right?);context_processors.py
into custom_app
folder;Add the following code to that new file:
def categories_processor(request): categories = Category.objects.all() return {'categories': categories}
Add context_processors.py
to TEMPLATE_CONTEXT_PROCESSORS
in settings.py
TEMPLATE_CONTEXT_PROCESSORS += ("custom_app.context_processors.categories_processor", )
And now you can use {{categories}}
in all the templates :D
As of Django 1.8
To add a TEMPLATE_CONTEXT_PROCESSORS
, in the settings you must add the next code:
TEMPLATES[0]['OPTIONS']['context_processors'].append("custom_app.context_processors.categories_processor")
Or include that string directly in the OPTIONS.context_processors
key in your TEMPLATES
setting.
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