Django 템플릿 변수가 있는 사전 값 검색 방법
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)
(사용하고 있습니다..get
키가 없으면 아무것도 반환되지 않습니다.네가 한다면.dictionary[key]
그것은 을 올릴 것이다.KeyError
그럼)
사용방법:
{{ mydict|get_item:item.NAME }}
루프의 사전에서 키와 값을 모두 가져옵니다.
{% for key, value in mydict.items %}
{{ value }}
{% endfor %}
읽기 쉽고 특별한 코딩이 필요하지 않습니다.어차피 열쇠와 루프 안의 값이 필요해요.
기본적으로는 할 수 없습니다.점은 속성 조회/키 조회/슬라이스의 구분자/트리거입니다.
템플릿 렌더링에서 점은 특별한 의미를 가집니다.변수 이름의 점은 조회를 나타냅니다.구체적으로는 템플릿시스템이 변수명의 닷을 검출하면 다음 순서로 검색을 시도합니다.
- 사전 검색.예: foo["bar"]
- 아트리뷰트 룩업예: foo.bar
- 리스트 인덱스 룩업예: foo[bar]
그러나 인수를 전달할 수 있는 필터를 만들 수 있습니다.
@register.filter(name='lookup')
def lookup(value, arg):
return value[arg]
{{ mydict|lookup:item.name }}
python 파일을 만들 때template_filters.py
아래 콘텐츠의 내 앱에서 작업을 수행했습니다.
# coding=utf-8
from django.template.base import Library
register = Library()
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
사용법은 culebron이 말한 것과 같습니다.
{{ mydict|get_item: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_ }}
환경: 장고 2.2
- 코드 예:
from django.template.defaulttags import register
@register.filter(name='lookup')
def lookup(value, arg):
return value.get(arg)
이 코드를 포트폴리오라는 프로젝트 폴더에 있는 template_filters.py라는 파일에 넣었습니다.
필터 코드를 어디에 넣어도 해당 폴더에 __init_.py가 있는지 확인합니다.
프로젝트 폴더/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',
}
},
},
]
html 코드로 라이브러리를 로드합니다.
{% load template_filters %}
코멘트는 할 수 없기 때문에 답변 형식으로 하겠습니다.
culebron의 답변이나 Tomita 유지의 답변을 기반으로 함수에 전달된 사전은 문자열 형식이기 때문에 이 예시와 같이 먼저 ast.literal_eval을 사용하여 문자열을 사전으로 변환하십시오.
이 편집에서는, 코드는 다음과 같이 됩니다.
# 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 }}
env: 장고 2.1.7
표시:
dict_objs[query_obj.id] = {'obj': query_obj, 'tag': str_tag}
return render(request, 'obj.html', {'dict_objs': dict_objs})
템플릿:
{% 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>
언급URL : https://stackoverflow.com/questions/8000022/django-template-how-to-look-up-a-dictionary-value-with-a-variable
'programing' 카테고리의 다른 글
Django: 원시 SQL 쿼리에서 명명된 매개 변수 사용 (0) | 2023.01.30 |
---|---|
Python Panda - 두 데이터 프레임 간의 차이점 찾기 (0) | 2023.01.30 |
Vuex 상태 어레이가 변환될 때 프록시 개체 전환 (0) | 2023.01.30 |
JavaScript를 사용하여 페이지를 새로 고치려면 어떻게 해야 합니까? (0) | 2023.01.30 |
MySQL 8 DB에 연결하려면 RMySQL 또는 RMariaDB를 선택하십시오. (0) | 2023.01.30 |