장고 템플릿의 사전 요소에 액세스하는 방법
나는 각 선택들이 얻은 표의 수를 출력하고 싶다.템플릿에 다음 코드가 있음:
{% for choice in choices %}
{{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}
votes
단지 사전일 뿐이다.choices
모델 오브젝트 입니다.
다음과 같은 메시지와 함께 예외를 제기한다.
"Could not parse the remainder"
choices = {'key1':'val1', 'key2':'val2'}
템플릿:
<ul>
{% for key, value in choices.items %}
<li>{{key}} - {{value}}</li>
{% endfor %}
</ul>
기본적으로.items
사전을 목록으로 나누는 장고 키워드다.(key, value)
파이톤 방법과 매우 유사한 쌍들.items()
이렇게 하면 장고 템플릿의 사전을 반복할 수 있다.
점 표기법을 사용할 수 있음:
도트 룩업은 다음과 같이 요약할 수 있다: 템플릿 시스템이 변수 이름의 점을 발견하면 다음과 같은 순서로 룩업을 시도한다.
- 사전 검색(예: foo["bar"))
- 속성 조회(예: foo.bar)
- 메서드 콜(예: foo.bar)
- 목록 인덱스 조회(예: foo[2])
시스템은 작동되는 첫 번째 조회 유형을 사용한다.그것은 단락 논리학이다.
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가 이 솔루션에 대해 다소 과한 것이지만, 그렇다고 심각한 해결책도 아니다.장고에서 템플릿의 목적은 템플릿과 반대로 코드로부터 격리하는 것이다.
위의 방법을 사용해 ORM이 속성을 미리 캐슁하여 해당 속성에 대한 하위 선택 항목만 만들 것인지 아니면 쿼리를 반복적으로 실행하여 투표 수를 계산하는 데 필요한지 여부를 머리 위로 잘 알 수 없기 때문에 ORM이 생성하는 SQL이 무엇인지 확인할 수 있다.하지만 만약 그것이 끔찍한 질의를 일으킨다면, 당신은 항상 당신이 직접 수집한 데이터로 당신의 관점에 있는 속성을 채울 수 있다.
예를 들어 여기서 'get' 템플릿 태그를 찾거나 정의하십시오.
태그 정의:
@register.filter
def hash(h, key):
return h[key]
그리고 그것은 다음과 같이 사용된다.
{% for o in objects %}
<li>{{ dictionary|hash:o.id }}</li>
{% endfor %}
@rush_spy의 대답과 유사하다.
<ul>
{% for choice in choices.items %}
<li>{{choice.0}} - {{choice.1}}</li>
{% endfor %}
</ul>
이것은 좀 더 복잡한 사전을 분해하는 데 적합할 수 있다.
django_from_from_message 필터 이름 get_value_from_message
{{ your_dict|get_value_from_dict:your_key }}
이상적으로는 투표에서 자신을 찾은 선택 개체에 대해 메소드를 생성하거나 모델 간의 관계를 생성하는 것이 좋다.사전 조회를 수행한 템플릿 태그도 작동할 것이다.
이 해결책보다 더 간단하고 좋은 것은 찾을 수 없었다.의사 선생님도 보시고
@register.filter
def dictitem(dictionary, key):
return dictionary.get(key)
그러나 반환된 항목이 객체라는 문제(여기에서도 논의됨)가 있어 나는 이 객체의 필드를 참조할 필요가 있다.다음과 같은 표현{{ (schema_dict|dictitem:schema_code).name }}
지원되지 않는 솔루션이므로 찾은 유일한 해결책은 다음과 같다.
{% with schema=schema_dict|dictitem:schema_code %}
<p>Selected schema: {{ schema.name }}</p>
{% endwith %}
업데이트:
@register.filter
def member(obj, name):
return getattr(obj, name, None)
그래서 필요없다with
태그:
{{ schema_dict|dictitem:schema_code|member:'name' }}
받아쓰기 대신 이름표를 써도 된다.이것은 데이터 클래스를 사용하기 위한 속기다.대신에
person = {'name': 'John', 'age': 14}
...실행:
from collections import namedtuple
Person = namedtuple('person', ['name', 'age'])
p = Person(name='John', age=14)
p.name # 'John'
이것은 단지 데이터가 있는 수업을 쓰는 것과 같다.일반적으로 나는 django 템플릿에 받아쓰기를 꺼린다. 왜냐하면 그것들은 어색하기 때문이다.
참조URL: https://stackoverflow.com/questions/1275735/how-to-access-a-dictionary-element-in-a-django-template
'Programing' 카테고리의 다른 글
'eslint-plugin-pretier' 모듈을 찾을 수 없음 (0) | 2022.03.18 |
---|---|
React Hooks API 호출 - inside useEffect? (0) | 2022.03.18 |
Vue.js의 URL에서 쿼리 매개 변수를 가져오는 방법 (0) | 2022.03.18 |
OrderDict의 시작 부분에 요소를 추가하는 방법? (0) | 2022.03.18 |
Vue Js의 한 구성 요소에서 다른 구성 요소로 데이터 값을 변경하는 방법 (0) | 2022.03.18 |