mydict = {"key1":"value1", "key2":"value2"}
A maneira regular para procurar um valor dicionário em um modelo de Django é {{ mydict.key1 }}
, {{ mydict.key2 }}
. E se a chave for uma variável de loop? ou seja:
{% for item in list %} # where item has an attribute NAME
{{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}
mydict.item.NAME
falha. Como consertar isto?
python
django
templates
dictionary
Stan
fonte
fonte
Busque a chave e o valor do dicionário no loop:
Acho isso mais fácil de ler e evita a necessidade de codificação especial. Eu geralmente preciso da chave e do valor dentro do loop de qualquer maneira.
fonte
Você não pode, por padrão. O ponto é o separador / gatilho da pesquisa de atributo / pesquisa de chave / fatia.
Mas você pode criar um filtro que permita passar um argumento:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
fonte
return value.get(arg)
porque isso não geraria uma exceção KeyError se a chave não estiver presente.Para mim, criar um arquivo python nomeado
template_filters.py
no meu aplicativo com o conteúdo abaixo fez o trabalhoo uso é como o que o culebrón disse:
fonte
register = Library()
? O que isso faz ?django.template.base.Library
classe. porregister = Library()
que instanciar a classe e usofilter
função anotador dentro dele para chegar a nossa necessidade.Eu tive uma situação semelhante. No entanto, eu usei uma solução diferente.
No meu modelo, crio uma propriedade que faz a pesquisa no dicionário. No modelo, então uso a propriedade
No meu modelo: -
No meu modelo: -
fonte
Como não posso comentar, deixe-me fazer isso na forma de uma resposta:
para aproveitar a resposta de culebrón ou a resposta de Yuji 'Tomita' Tomita , o dicionário passado para a função está na forma de uma string, portanto, use ast. literal_eval para converter a string em um dicionário primeiro, como neste exemplo .
Com esta edição, o código deve ficar assim:
fonte
Ambiente: Django 2.2
Coloquei esse código em um arquivo chamado template_filters.py na minha pasta do projeto chamada portfoliomgr
Não importa onde você colocou o código do filtro, verifique se possui __init__.py nessa pasta
Adicione esse arquivo à seção de bibliotecas na seção de modelos no arquivo projectfolder / settings.py. Para mim, é portfoliomgr / settings.py
No seu código html, carregue a biblioteca
fonte
env: django 2.1.7
Visão:
modelo:
fonte
{{ dict_obj.obj.obj_name }}
é, nesse caso, equivalente ao código Pythondict_obj["obj"]["obj_name"]
, no entanto, a pergunta é sobre o equivalente adict_obj[obj][obj_name]
.