---
slug: "DjangoTemplateViewを、@cached_propertyを多用して書いてみる"
title: "Trying Out Django TemplateView with Extensive Use of @cached_property"
description: "Sample remote interpreter / SSH setup for developing Rails inside a Vagrant VM using RubyMine."
url: "https://www.ytyng.com/en/blog/DjangoTemplateViewを、@cached_propertyを多用して書いてみる"
publish_date: "2015-10-29T08:35:23Z"
created: "2015-10-29T08:35:23Z"
updated: "2026-05-11T13:21:34.159Z"
categories: ["Django"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/1d62e61764ce49089fa1ac574246d770.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "en"
---

# Trying Out Django TemplateView with Extensive Use of @cached_property

<div class="document">


<p>Django's built-in django.views.generic.TemplateView is a powerful tool.</p>
<p>It includes all the methods needed to generate HTML, making it very easy to create pages.</p>
<p>Although simple, it is rich in features and flexible, allowing for various ways to write code.</p>
<p>・Override the get method</p>
<pre class="literal-block">def get(self, request, **kwargs):
    return self.render_to_response({
            'items': Hoge.objects.filter(...)
        })
</pre>
<p>・Inject variables from urls.py</p>
<pre class="literal-block">url(r'^page/$',
    TemplateView.as_view(
        template_name="html_page/agreement.html",
        items=xxx),
    name='page'),
</pre>
<p>This time, I will show an example of sending variables to the template using cached_property.</p>
<p>Looking at the get method of TemplateView,</p>
<pre class="literal-block">context = self.get_context_data(**kwargs)
</pre>
<p>there is such code. And, looking at get_context_data,</p>
<pre class="literal-block">def get_context_data(self, **kwargs):
    if 'view' not in kwargs:
        kwargs['view'] = self
    return kwargs
</pre>
<p>it looks like this.</p>
<p>In other words, if you do not override TemplateView's get and get_context_data, you can access the calling view instance from within the template using the view argument.</p>
<p>Therefore,</p>
<pre class="literal-block">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)
</pre>
<p>Template</p>
<pre class="literal-block">&lt;table&gt;
{% for item in view.items %}
  &lt;tr&gt; .... {{ item.... }} &lt;/tr&gt;
{% endfor %}
&lt;/table&gt;

Total: {{ view.total }}

Average: {{ view.average }}
</pre>
<p>This kind of approach is also valid. It allows for separation of concerns and reduces the number of SQL queries issued.</p>
<p>However, there is a drawback that exceptions may be swallowed when they occur.</p>
</div>
