programing

Django 템플릿 변수가 있는 사전 값 검색 방법

goodcopy 2023. 1. 30. 22:31
반응형

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]

그러나 인수를 전달할 수 있는 필터를 만들 수 있습니다.

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/ #writing-custom-communicate-display

@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

  1. 코드 예:


    from django.template.defaulttags import register

    @register.filter(name='lookup')
    def lookup(value, arg):
        return value.get(arg)

이 코드를 포트폴리오라는 프로젝트 폴더에 있는 template_filters.py라는 파일에 넣었습니다.

  1. 필터 코드를 어디에 넣어도 해당 폴더에 __init_.py가 있는지 확인합니다.

  2. 프로젝트 폴더/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. 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

반응형