2016-10-19 1 views
0

오늘은 내 발전에 이상한 문제가 있습니다. 나는 아주 최소한의 예제로 그것을 재현했다.Django 템플릿 : 왜 __call__ 마법 메서드는 모델 객체가 아닌 객체의 렌더링을 중단합니까?

class DummyClassA(object): 
    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return 'Dummy1 object called ' + self.name 


class DummyClassB(object): 
    """Same as ClassA, with the __call__ method added""" 
    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return 'Dummy2 object called ' + self.name 

    def __call__(self, *args, **kwargs): 
     return "bar" 

그들은 동일하지만, 두 번째는 특별한 __call__() 방법이있다 :이 두 더미 클래스에서보세요 (비 장고 모델 서브 클래스)가 있습니다.

:

<h1>Objects repr</h1> 
    <ul> 
     {% for element in list1 %} 
      <li>{{ element }}</li> 
     {% endfor %} 
    </ul> 
    <ul> 
     {% for element in list2 %} 
      <li>{{ element }}</li> 
     {% endfor %} 
    </ul> 

    <h1>Access members</h1> 
    <ul> 
     {% for element in list1 %} 
      <li>{{ element.name }}</li> 
     {% endfor %} 
    </ul> 
    <ul> 
     {% for element in list2 %} 
      <li>{{ element.name }}</li> 
     {% endfor %} 
    </ul> 

I이 결과를 얻었다 :

class MyView(TemplateView): 

    template_name = 'myapp/home.html' 

    def get_context_data(self, **kwargs): 
     ctx = super(MyView, self).get_context_data(**kwargs) 

     list1 = [ 
      DummyClassA(name="John"), 
      DummyClassA(name="Jack"), 
     ] 

     list2 = [ 
      DummyClassB(name="Albert"), 
      DummyClassB(name="Elmer"), 
     ] 

     ctx.update({ 
      'list1': list1, 
      'list2': list2, 
     }) 
     return ctx 

와 해당 템플릿 :

제가 내장 장고 템플릿 엔진을 이용하는 관점에서이 2 개의 오브젝트의 인스턴스를 표시 할

html result

두 번째 클래스 ({{ element }})의 자세는 __repr__() 대신 __call__ 메서드가 실행되며 클래스의 멤버에 액세스하려면 아무 것도 반환하지 않습니다.

__call__()을 정의하면 장고 템플릿 엔진이 이러한 인스턴스를 처리 할 수 ​​있는지 이해할 수 없습니다. 나는 이것이 버그는 아니지만 주로 기능이지만, 궁금한데, 왜 __call__()이 그런 경우에 실행되는지 상상해보십시오. 그리고 왜 두 번째 목록에 element.name 값을 얻을 수 없습니까?

답변

1

템플릿 언어가 그렇게 설계 되었기 때문입니다. As the docs state :

결과 값 [변수 조회 중]이 호출 가능한 경우 인수없이 호출됩니다. 호출 결과가 템플릿 값이됩니다.

템플릿 구문에서 괄호 사용을 허용하지 않기 때문에 템플릿에 메서드를 호출 할 방법이 없습니다.

+0

감사합니다. 완전히 의미가 있습니다. – Antwane

관련 문제