답변:
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- 요청은 투표 수를 계산하기 위해 쿼리를 실행합니다. 그러나 끔찍한 쿼리를 생성하는 경우 언제든지 수집 한 데이터로보기의 속성을 채울 수 있습니다.
.items
은 다른 답변들 중 하나에서 설명 된 것처럼 호출 과 결합되어 훨씬 간단한 솔루션입니다.
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 템플릿에서 사전을 반복 할 수 있습니다.
items
Django 키워드가 아닌 사전에 대한 Python 메소드 호출입니다. 으로 알렉스 마르 텔리는 지적 은 기본적으로 동일합니다 iteritems
. Wilhelm이 대답했듯이 사전 조회는 도트 조회에서 3 위입니다. 사전에이라는 이름의 항목이 있으면 'items'
튜플 목록 대신 해당 값을 가져옵니다. 테스트하려면 : {'items':'oops'}
사전에 추가 하면 단어 'oops'에서 글 머리 기호 목록이 표시됩니다.
점 표기법을 사용할 수 있습니다.
도트 룩업은 다음과 같이 요약 될 수 있습니다. 템플릿 시스템이 변수 이름에서 도트를 발견하면 다음 순서로 다음 룩업을 시도합니다.
- 사전 조회 (예 : foo [ "bar"])
- 속성 조회 (예 : foo.bar)
- 메소드 호출 (예 : foo.bar ())
- 목록 인덱스 조회 (예 : foo [2])
시스템은 작동하는 첫 번째 조회 유형을 사용합니다. 단락 논리입니다.
my_dict[1][2]
템플릿 코드 :my_dict.1.2
d.key.1
-두 번째 참고.
django_template_filter 필터 이름 get_value_from_dict
{{ your_dict|get_value_from_dict:your_key }}