IT story

Django 템플릿에서 사전 요소에 액세스하는 방법은 무엇입니까?

hot-time 2020. 5. 27. 07:40
반응형

Django 템플릿에서 사전 요소에 액세스하는 방법은 무엇입니까?


각 선택의 투표 수를 인쇄하고 싶습니다. 이 코드는 템플릿에 있습니다.

{% for choice in choices %}
    {{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}

voteschoices모델 객체 인 반면 사전 입니다.

이 메시지와 함께 예외가 발생합니다.

"Could not parse the remainder"

Jeff의 의견을 반영 / 확장하기 위해 내가 목표로 삼아야 할 것은 단순히 해당 객체와 관련된 투표 수를 계산하는 Choice 클래스의 속성입니다.

    class Choice(models.Model):
        text = models.CharField(max_length=200) 

        def calculateVotes(self):
            return Vote.objects.filter(choice = self).count()

        votes = property(calculateVotes)

그런 다음 템플릿에서 다음을 수행 할 수 있습니다.

    {% for choice in choices %}
            {{choice.choice}} - {{choice.votes}} <br />
    {% endfor %}

템플릿 태그는 IMHO 가이 솔루션에 약간 과잉이지만, 끔찍한 해결책도 아닙니다. Django에서 템플릿의 목표는 템플릿의 코드로부터 사용자를 격리시키는 것입니다.

위의 방법을 시도하고 속성을 사전 캐시하고 속성에 대한 하위 선택을 만들거나 반복적으로 / on- 요청은 투표 수를 계산하기 위해 쿼리를 실행합니다. 그러나 끔찍한 쿼리를 생성하는 경우 언제든지 수집 한 데이터로보기의 속성을 채울 수 있습니다.


choices = {'key1':'val1', 'key2':'val2'}

템플릿은 다음과 같습니다.

<ul>
{% for key, value in choices.items %} 
  <li>{{key}} - {{value}}</li>
{% endfor %}
</ul>

기본적으로 Python 메소드와 매우 유사하게 .items사전을 (key, value)목록으로 나누는 Django 키워드입니다 .items(). 이를 통해 Django 템플릿에서 사전을 반복 할 수 있습니다.


점 표기법을 사용할 수 있습니다.

도트 룩업은 다음과 같이 요약 될 수 있습니다. 템플릿 시스템이 변수 이름에서 도트를 발견하면 다음 순서로 다음 룩업을 시도합니다.

  • 사전 조회 (예 : foo [ "bar"])
  • 속성 조회 (예 : foo.bar)
  • 메소드 호출 (예 : foo.bar ())
  • 목록 인덱스 조회 (예 : foo [2])

시스템은 작동하는 첫 번째 조회 유형을 사용합니다. 단락 논리입니다.


'get'템플릿 태그를 찾거나 정의해야합니다 (예 : here) .

태그 정의 :

@register.filter
def hash(h, key):
    return h[key]

그리고 그것은 다음과 같이 사용됩니다 :

{% for o in objects %}
  <li>{{ dictionary|hash:o.id }}</li>
{% endfor %}

사전 항목 사용

        {% for key, value in my_dictionay.items %}
          <li>{{ key }} : {{ value }}</li>
        {% endfor %}

django_template_filter 필터 이름 get_value_from_dict

{{ your_dict|get_value_from_dict:your_key }}

@russian_spy의 답변과 유사합니다.

<ul>
{% for choice in choices.items %} 
  <li>{{choice.0}} - {{choice.1}}</li>
{% endfor %}
</ul>

더 복잡한 사전을 분류하는 데 적합 할 수 있습니다.


이상적으로는 투표에서 찾은 선택 객체에 대한 메소드를 작성하거나 모델 간의 관계를 작성하는 것이 이상적입니다. 사전 조회를 수행 한 템플릿 태그도 작동합니다.

참고 URL : https://stackoverflow.com/questions/1275735/how-to-access-a-dictionary-element-in-a-django-template

반응형