오늘은 내 발전에 이상한 문제가 있습니다. 나는 아주 최소한의 예제로 그것을 재현했다.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 개의 오브젝트의 인스턴스를 표시 할
두 번째 클래스 ({{ element }}
)의 자세는 __repr__()
대신 __call__
메서드가 실행되며 클래스의 멤버에 액세스하려면 아무 것도 반환하지 않습니다.
왜 __call__()
을 정의하면 장고 템플릿 엔진이 이러한 인스턴스를 처리 할 수 있는지 이해할 수 없습니다. 나는 이것이 버그는 아니지만 주로 기능이지만, 궁금한데, 왜 __call__()
이 그런 경우에 실행되는지 상상해보십시오. 그리고 왜 두 번째 목록에 element.name
값을 얻을 수 없습니까?
감사합니다. 완전히 의미가 있습니다. – Antwane