[python] Django 템플릿에서 사전 요소에 액세스하는 방법은 무엇입니까?
각 선택의 투표 수를 인쇄하고 싶습니다. 이 코드는 템플릿에 있습니다.
{% for choice in choices %}
{{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}
votes
choices
모델 객체 인 반면 사전 입니다.
이 메시지와 함께 예외가 발생합니다.
"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 %}
답변
답변
@russian_spy의 답변과 유사합니다.
<ul>
{% for choice in choices.items %}
<li>{{choice.0}} - {{choice.1}}</li>
{% endfor %}
</ul>
보다 복잡한 사전을 분류하는 데 적합 할 수 있습니다.