465👍
Write a custom template filter:
from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
(I use .get
so that if the key is absent, it returns none. If you do dictionary[key]
it will raise a KeyError
then.)
usage:
{{ mydict|get_item:item.NAME }}
93👍
Fetch both the key and the value from the dictionary in the loop:
{% for key, value in mydict.items %}
{{ value }}
{% endfor %}
I find this easier to read and it avoids the need for special coding. I usually need the key and the value inside the loop anyway.
- [Django]-Adding css class to field on validation error in django
- [Django]-Django return file over HttpResponse – file is not served correctly
- [Django]-CORS: Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true
50👍
You can’t by default. The dot is the separator / trigger for attribute lookup / key lookup / slice.
Dots have a special meaning in template rendering. A dot in a variable
name signifies a lookup. Specifically, when the template system
encounters a dot in a variable name, it tries the following lookups,
in this order:
- Dictionary lookup. Example: foo[“bar”]
- Attribute lookup. Example: foo.bar
- List-index lookup. Example: foo[bar]
But you can make a filter which lets you pass in an argument:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
@register.filter(name='lookup')
def lookup(value, arg):
return value[arg]
{{ mydict|lookup:item.name }}
- [Django]-Timestamp fields in django
- [Django]-Google Static Maps URL length limit
- [Django]-Has Django served an excess of 100k daily visits?
8👍
For me creating a python file named template_filters.py
in my App with below content did the job
# coding=utf-8
from django.template.base import Library
register = Library()
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
usage is like what culebrón said :
{{ mydict|get_item:item.NAME }}
- [Django]-Django admin file upload with current model id
- [Django]-Django.contrib.gis.db.backends.postgis vs django.db.backends.postgresql_psycopg2
- [Django]-Authenticate by IP address in Django
3👍
Environment: Django 2.2
- Example code:
from django.template.defaulttags import register
@register.filter(name='lookup')
def lookup(value, arg):
return value.get(arg)
I put this code in a file named template_filters.py in my project folder named portfoliomgr
-
No matter where you put your filter code, make sure you have __init__.py in that folder
-
Add that file to libraries section in templates section in your projectfolder/settings.py file. For me, it is portfoliomgr/settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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',
],
'libraries':{
'template_filters': 'portfoliomgr.template_filters',
}
},
},
]
-
In your html code load the library
{% load template_filters %}
- [Django]-Trying to migrate in Django 1.9 — strange SQL error "django.db.utils.OperationalError: near ")": syntax error"
- [Django]-How can I get the full/absolute URL (with domain) in Django?
- [Django]-How to get the name of current app within a template?
2👍
I had a similar situation. However I used a different solution.
In my model I create a property that does the dictionary lookup. In the template I then use the property.
In my model: –
@property
def state_(self):
""" Return the text of the state rather than an integer """
return self.STATE[self.state]
In my template: –
The state is: {{ item.state_ }}
- [Django]-Django – How to use decorator in class-based view methods?
- [Django]-Django urlsafe base64 decoding with decryption
- [Django]-How to define two fields "unique" as couple
1👍
Since I can’t comment, let me do this in the form of an answer:
to build on culebrón’s answer or Yuji ‘Tomita’ Tomita’s answer, the dictionary passed into the function is in the form of a string, so perhaps use ast.literal_eval to convert the string to a dictionary first, like in this example.
With this edit, the code should look like this:
# code for custom template tag
@register.filter(name='lookup')
def lookup(value, arg):
value_dict = ast.literal_eval(value)
return value_dict.get(arg)
<!--template tag (in the template)-->
{{ mydict|lookup:item.name }}
- [Django]-Get user profile in django
- [Django]-*_set attributes on Django Models
- [Django]-How to recursively query in django efficiently?
0👍
The accepted answer works fine, but I just want to add how to drill down nested value using filter chaining
mydict = {"USD": { "amount": 30 }, "JPY": { "amount": 3000 }}
currency = "JPY"
{{ mydict|get_item:currency|get_item:"amount" }}
The output will be 3000
- [Django]-Remove pk field from django serialized objects
- [Django]-Error when using django.template
- [Django]-How to add a cancel button to DeleteView in django
0👍
After the 11 years later.
You can use this doc for 4.2 https://docs.djangoproject.com/en/4.2/howto/custom-template-tags/
views.py
from django.template.defaultfilters import register
@register.simple_tag
def example_tag(var_1, var_2, *args, **kwargs):
args_1 = kwargs["args_1"]
args_2 = kwargs["args_2"]
return args_1+" "+ args_2
example.html
{% example_tag variable_1 variable_2 args_1="hi" args_2="hello" %}
output
hi hello
- [Django]-Suppress "?next=blah" behavior in django's login_required decorator
- [Django]-What is the difference between null=True and blank=True in Django?
- [Django]-Malformed Packet: Django admin nested form can't submit, connection was reset
-1👍
env: django 2.1.7
view:
dict_objs[query_obj.id] = {'obj': query_obj, 'tag': str_tag}
return render(request, 'obj.html', {'dict_objs': dict_objs})
template:
{% for obj_id,dict_obj in dict_objs.items %}
<td>{{ dict_obj.obj.obj_name }}</td>
<td style="display:none">{{ obj_id }}</td>
<td>{{ forloop.counter }}</td>
<td>{{ dict_obj.obj.update_timestamp|date:"Y-m-d H:i:s"}}</td>
- [Django]-New url format in Django 1.9
- [Django]-Django: Filter a Queryset made of unions not working
- [Django]-Django Admin Form for Many to many relationship