[python] 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>

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