2012-12-12 5 views
0

컨테이너의 하위 클래스 인 인스턴스 인 Python 객체가 있습니다. 따라서이 객체 인 xx['name']처럼 동작 할 수 있습니다. 이 객체에는 메서드가 있습니다 (예 : x.bar()).Django 템플릿에서 컨테이너에 액세스하는 방법

을 장고 템플릿에서 어떻게 호출합니까? x.bar 템플릿은 항상 x['bar']으로 평가되며, 이는 None이됩니다.

내가 생각할 수있는 가장 좋은 점은 getitem이없는 섀도 잉 x 개체를 만드는 것입니다. 하지만 난 delattr__getitem__ 수 없습니다.

더 좋은 아이디어가 있습니까? 컨텍스트 또는 템플릿 태그에서 이러한 호출의 결과를 수동으로 전달하지 못합니다.

감사합니다.

+0

프록시 클래스를 만들고 __getattr__을 사용하여 개체의 메서드를 호출 할 수 있다고 가정합니다. – Overclocked

답변

1

이것은 장고 템플릿이 표현식 평가를하는 방식의 근본적인 결함입니다. 해결 방법은 템플릿 태그 {% expr -arbitrary-python-expression- %}을 참조하십시오. 예 : {% expr x.bar(1,2,3) as snort %}snort이라는 현재 컨텍스트의 새 변수를 제공합니다.

또는 Jinja2 템플릿을 사용해보세요. 그들은 Django에 매우 가깝지만 완전한 Python을 허용합니다.

참고 : Jinja2하지 장고와 같은 템플릿 시스템 , 당신은 템플릿 시스템에 따라 모든 페이지 내장 장고 응용 프로그램의를 사용하는 경우,이 그들을 깰 수 있습니다. {% expr %} 태그에는 해당 사항이 없습니다.

+0

저는 템플릿에서 일반 파이썬 표현식에 대한 팬이 아니지만, 여기에 무슨 뜻인지 알고 있습니다. 이것은 유일한 대안 일 수 있습니다. – Overclocked

+0

@Overclocked : 우리는 매우 보수적으로'expr'를 사용합니다; 주로 * 큰 * 형식의 데이터를 캐시하는 템플릿 영역에 있습니다. 캐시가 만료 된 경우 (보기에서 사용할 수없는 정보) 템플릿 내부에서 데이터 가져 오기가 발생합니다. 이로 인해 우리에게 큰 성과가 나타났습니다. 우리는 카레 함수를 전달하려했지만 몇 년 동안 수정되지 않은 버그가 발생했습니다. 마지막으로 1.3으로 수정되었습니다 ([# 7153] (https://code.djangoproject.com/ticket/7153)). –

관련 문제