Django - How to make a variable available to all templates?
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:
- Add
custom_app
toINSTALLED_APPS
insettings.py
(you've done it already, right?); - Create a
context_processors.py
intocustom_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
toTEMPLATE_CONTEXT_PROCESSORS
insettings.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.
How do I pass variables to all templates in django?
You, my friend, are in the market for Context Processors.
From a blog entry written by a far nimbler and erudite technical writer than I:
What are template context processors?
Django’s context processors are a facility that allows you to provide data and callbacks to your templates.
You can do so in one of two ways:
- On an individual request basis: by passing a custom
Context
value to yourrender_to_response()
call- Globally: by creating a context processor method that accepts a
HttpRequest
object as input, and returns a payload or callback, then
registering the context processor in yoursettings.py
, then providing yourrender_to_response()
call with the built-inRequestContext
attribute
instead of your own (you can always extendRequestContext
to add more data on an individual request basis of course).
If that approach for passing data to templates sounded absurd and obfuscated to you, you’re not alone. The complexity involved in such a simple operation is unwarranted and counter-productive, but every system has its shortcomings.
The official documentation is here:
https://docs.djangoproject.com/en/dev/ref/templates/api/
So but yeah, I have been programming with Django for a while, and one of the reasons I really like solving problems w/ it is because it is almost Byzantine in its complexity, but not in a domineering sort of way. It has a ton of geegaws and doodads that may not immediately appear useful; each of these either comes in extremely handy when you need it, and it will stay out of your way if not.
The upshot here for you is: context processors are a fine example of those. Yes.
How to set a value of a variable inside a template code?
You can use the with
template tag.
{% with name="World" %}
<html>
<div>Hello {{name}}!</div>
</html>
{% endwith %}
django variable available to all the views
You may want to implement a custom Middleware.
https://docs.djangoproject.com/en/dev/topics/http/middleware/
This lets you execute custom code for every request and attach the results to the request
object, which is then accessible in your view.
Having a global variable available to your templates in Django
Django has a standard way for implementing this, which is context processors. This article provides an example implementation
https://www.webforefront.com/django/setupdjangocontextprocessors.html.
Actually a context processor is just a function that accepts a request object and returns a dict with the data you want.
How do I get all the variables defined in a Django template?
Both Ned's and blaine's answers are good, but if you really want to achieve exactly what you ask for there's a template tag for it:
{% debug %}
Builtins:debug
More information in the context_processor.debug including:
If this processor is enabled, every RequestContext will contain debug
and and sql_queries variables – but only if your DEBUG setting
is set to True and the request’s IP address (request.META['REMOTE_ADDR']
)
is in the INTERNAL_IPS setting
Similar to Peter G suggestion, I often use a <div id="django-debug"><pre>{% debug|escape %}</pre></div>
block at the end of the page that has display:none
but that I can inspect to debug.
Related Topics
Pyeval_Initthreads in Python 3: How/When to Call It? (The Saga Continues Ad Nauseam)
How to Use If/Else in a Dictionary Comprehension
Django Template System, Calling a Function Inside a Model
How to Read Datetime Back from SQLite as a Datetime Instead of String in Python
How to Check If There Exists a Process with a Given Pid in Python
Default Filter in Django Admin
Nltk-Based Text Processing with Pandas
Building Lxml for Python 2.7 on Windows
How to Quickly Estimate the Distance Between Two (Latitude, Longitude) Points
Any Gotchas Using Unicode_Literals in Python 2.6
Opencv Python: Cv2.Findcontours - Valueerror: Too Many Values to Unpack
Ioerror: [Errno 22] Invalid Mode ('R') or Filename: 'C:\\Python27\Test.Txt'
Convert Bytes to Floating Point Numbers
How to Enable MySQL Client Auto Re-Connect with MySQLdb