---
slug: "Djangoのテンプレートビュー(TemplateView)で文字列置換する方法"
title: "Djangoのテンプレートビュー (TemplateView)で文字列置換する方法"
description: "\n\n\nDjangoのテンプレートビュー ( TemplateViewクラス) を使って、HTMLテンプレートをそのまま出力したいけど、\nその出力結果の文字列を一括置換したい方法2案です。"
url: "https://www.ytyng.com/blog/Djangoのテンプレートビュー(TemplateView)で文字列置換する方法"
publish_date: "2015-07-07T05:38:10Z"
created: "2015-07-07T05:38:10Z"
updated: "2026-02-27T10:43:20.758Z"
categories: ["Django"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/8293e79040a24c90b69630227346afad.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# Djangoのテンプレートビュー (TemplateView)で文字列置換する方法

<div class="document">


<p>Djangoのテンプレートビュー ( TemplateViewクラス) を使って、HTMLテンプレートをそのまま出力したいけど、
その出力結果の文字列を一括置換したい方法2案です。</p>
<p>middleware は使わず、urls.py で処理します。</p>
<div class="section" id="as-view">
<h3>案1  as_view の結果をデコレーションする</h3>
<p>urls.py</p>
<pre class="literal-block">url(r'^hoge-page/$',
     TemplateView.as_view(
         template_name="hoge-page"),
     name='hoge-page'),
</pre>
<p>▲これを</p>
<pre class="literal-block">url(r'^hoge-page/$',
     content_replace_decorator(TemplateView.as_view(
         template_name="hoge-page")),
     name='hoge-page'),
</pre>
<p>▲こういった形に変更して使う、出力結果内の文字列置換を行うデコレータを考えます。</p>
<pre class="literal-block">def content_replace_decorator(func):

    @functools.wraps(func)
    def wrapper(view, *args, **kwargs):
        result = func(view, *args, **kwargs)

        def callback(response):
            response.content = response.content.replace(
                FROM_WORD.encode('utf-8'),
                TO_WORD.encode('utf-8'))

        if isinstance(result, HttpResponse):
            result.add_post_render_callback(callback)
        return result

    return wrapper
</pre>
</div>
<div class="section" id="templateview">
<h3>案2 TemplateView を継承したクラスを作る</h3>
<pre class="literal-block">url(r'^hoge-page/$',
     TemplateView.as_view(
         template_name="hoge-page"),
     name='hoge-page'),
</pre>
<p>▲これを</p>
<pre class="literal-block">url(r'^hoge-page/$',
     ContentReplaceTemplateView.as_view(
         template_name="hoge-page"),
     name='hoge-page'),
</pre>
<p>▲こう変えて、出力結果の文字列置換を行うクラスを考えます。</p>
<pre class="literal-block">class ContentReplaceTemplateView(TemplateView):
    @staticmethod
    def callback(response):
        response.content = response.content.replace(
            FROM_WORD.encode('utf-8'),
            TO_WORD.encode('utf-8'))

    def get(self, request, *args, **kwargs):
        result = super(ContentReplaceTemplateView, self).get(
            request, *args, **kwargs)
        result.add_post_render_callback(self.callback)
        return result
</pre>
<p>いずれにせよポイントとしては、HttpResponse のインスタンスの add_post_render_callback に変換メソッドを入れます。</p>
<p>こうしないで直接 HttpResponse インスタンスの content を操作しようとすると例外が出ます。</p>
</div>
</div>
