今日は私の開発の奇妙な問題に直面しました。私は非常に最小の例でそれを再現しました。これら2つのダミークラス(非Djangoのモデルのサブクラス)を見てください: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"
彼らは同じですが、2番目は、特殊な__call__()
方法があります。
私は組み込みDjangoテンプレートエンジンを使用してビューにこれらの2つのオブジェクトのインスタンスを表示したい:
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
と対応するテンプレート:
:<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>
私はこの結果を得ます
2番目のクラス({{ element }}
)のスタンス、__repr__()
の代わりに__call__
メソッドが実行され、クラスのメンバーにアクセスしたい場合は何も返しません。
__call__()
を定義して、Djangoテンプレートエンジンがこれらのインスタンスを処理する方法を変更する理由を理解できません。私はこれがバグではなく、主に機能だと思っていますが、好奇心が強いのですが、なぜ__call__()
がこのような場合に実行されるのですか?そして、なぜ私はelement.name
の値を2番目のリストに入れられないのですか?
ありがとうございました – Antwane