Django TemplateView を、@cached_property を多用して書いてみる

(コメント)

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 も少なくできます。

ただし、例外が出た時に握りつぶされてしまうという欠点があります。

現在の評価: 2

コメント

最近のツイート

  • 小泉しゅうすけ@寒川町議会議員

    小泉しゅうすけ@寒川町議会議員 @KoizumiSamukawa

    ytyng

    漫画歴代発行部数ランキングとか見ると、上位はことごとく犯罪行為が平気で描かれている作品ばかりです。で、これらの漫画を読んで犯罪を起こした人はどの程度居るのでしょうか…ゴルゴ13を読んでスナイパーになった人は果たして存在するのかどう… https://t.co/ndFS6wezxQ
    1 週間, 6 日 前

  • ytyng

    ytyng @ytyng

    MacBookのロゴを隠してるとプロっぽい。小並感だけど。 https://t.co/SRe5T68hHR
    2 週間 前

  • ytyng

    ytyng @ytyng

    初めてnpmにパッケージ上げた
    2 週間, 4 日 前