Django template how to look up a dictionary value with a variable

后端 未结 8 1501
面向向阳花
面向向阳花 2020-11-22 03:06
mydict = {\"key1\":\"value1\", \"key2\":\"value2\"}

The regular way to lookup a dictionary value in a Django template is {{ mydict.key1 }}

相关标签:
8条回答
  • 2020-11-22 03:14

    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>
    
    0 讨论(0)
  • 2020-11-22 03:15

    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_ }}
    
    0 讨论(0)
  • 2020-11-22 03:16

    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 }}
    
    0 讨论(0)
  • 2020-11-22 03:18

    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.

    0 讨论(0)
  • 2020-11-22 03:19

    Environment: Django 2.2

    1. 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

    1. No matter where you put your filter code, make sure you have __init__.py in that folder

    2. 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',
                    }
                },
            },
        ]
    
    
    1. In your html code load the library

      
      {% load template_filters %}
      
    0 讨论(0)
  • 2020-11-22 03:25

    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 }}
    
    0 讨论(0)
提交回复
热议问题