Django に標準搭載の django.views.generic.TemplateView。
HTML生成に必要なメソッドが全部入りで、非常に簡単にページを作ることができます。
シンプルながら機能が豊富で柔軟なため、いろんな書き方ができます。
・get メソッドをオーバーライドする
def get(self, request, **kwargs):
return self.render_to_response({
'items': Hoge.objects.filter(...)
})
・urls.py から変数を差し込む
url(r'^page/$',
TemplateView.as_view(
template_name="html_page/agreement.html",
items=xxx),
name='page'),
今回は、cached_property 主体でテンプレートに変数を送る例です。
TemplateView の、get を見てみると、
context = self.get_context_data(**kwargs)
というコードがあります。そして、 get_context_data を見てみると
def get_context_data(self, **kwargs):
if 'view' not in kwargs:
kwargs['view'] = self
return kwargs
となっています。
つまり、TemplateView の get, および get_context_data をオーバーライドしない場合、テンプレート内から view という引数で、呼び出し元の ビューインスタンスにアクセスできます。
そのため
class HogeView(TemplateView):
template_name = '........'
@cached_property
def items(self):
return list(Hoge.objects.filter(...))
@cached_property
def total(self):
return sum([ i.count for i in self.items])
@cached_property
def average(self):
return self.total / len(self.items)
テンプレート
<table>
{% for item in view.items %}
<tr> .... {{ item.... }} </tr>
{% endfor %}
</table>
合計: {{ view.total }}
平均: {{ view.average }}
このような書き方もアリかなと。興味の分離ができて、発行する SQL も少なくできます。
ただし、例外が出た時に握りつぶされてしまうという欠点があります。