장고 템플릿 변수로 사전 값을 찾는 방법
mydict = {"key1":"value1", "key2":"value2"}
Django 템플릿에서 사전 값을 조회하는 일반적인 방법은 {{ mydict.key1 }}
, {{ mydict.key2 }}
입니다. 키가 루프 변수이면 어떻게 되나요? 즉 :
{% 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
실패합니다. 이 문제를 해결하는 방법?
사용자 정의 템플릿 필터를 작성하십시오.
from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
(I 사용 .get
하므로 키가 존재하지 않는 경우, 그것은 아무것도 반환하지 않습니다 것을. 당신이 경우에 dictionary[key]
그것은을 올릴 것이다 KeyError
다음.)
용법:
{{ mydict|get_item:item.NAME }}
루프의 사전에서 키와 값을 모두 가져옵니다.
{% for key, value in mydict.items %}
{{ value }}
{% endfor %}
나는 이것을 쉽게 읽을 수 있으며 특별한 코딩이 필요하지 않습니다. 어쨌든 일반적으로 루프 내부의 키와 값이 필요합니다.
기본적으로 할 수 없습니다. 점은 속성 조회 / 키 조회 / 슬라이스에 대한 구분자 / 트리거입니다.
점은 템플릿 렌더링에 특별한 의미가 있습니다. 변수 이름의 점은 조회를 나타냅니다. 특히 템플릿 시스템이 변수 이름에 점이 있으면 다음 순서로 다음 조회를 시도합니다.
- 사전 검색. 예 : foo [ "bar"]
- 속성 조회. 예 : foo.bar
- 리스트 인덱스 조회. 예 : foo [bar]
그러나 인수를 전달할 수있는 필터를 만들 수 있습니다.
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 }}
나는 비슷한 상황을 겪었다. 그러나 다른 솔루션을 사용했습니다.
내 모델에서는 사전 조회를 수행하는 속성을 만듭니다. 그런 다음 템플릿에서 속성을 사용합니다.
내 모델에서 :-
@property
def state_(self):
""" Return the text of the state rather than an integer """
return self.STATE[self.state]
내 템플릿에서 :-
The state is: {{ item.state_ }}
template_filters.py
아래 내용으로 내 앱에 python 파일을 만들면 작업이 완료되었습니다.
# coding=utf-8
from django.template.base import Library
register = Library()
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
사용법은 culebrón이 말한 것과 같습니다.
{{ mydict|get_item:item.NAME }}
env : 장고 2.1.7
전망:
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>
'development' 카테고리의 다른 글
.NET 리플렉션 비용이 얼마나 듭니까? (0) | 2020.05.06 |
---|---|
TortoiseGit으로 Git 브랜치를 삭제하는 방법 (0) | 2020.05.06 |
Jenkins에서 환경 변수를 설정하는 방법은 무엇입니까? (0) | 2020.05.06 |
리스트리스트의 모든 조합 (0) | 2020.05.06 |
java : float을 String으로 변환하고 String을 float로 변환 (0) | 2020.05.06 |