How to Replace Strings in Django TemplateView

Django
2015-07-07 14:38 (9 years ago) ytyng
<div class="document">

<p>Here are two methods to output an HTML template as it is using Django's TemplateView class, but replacing strings in the output result at once.</p>
<p>We will handle this in urls.py without using middleware.</p>

<div class="section" id="as-view">
<h3>Method 1: Decorate the result of 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>▲ Change this to:</p>
<pre class="literal-block">url(r'^hoge-page/$',
     content_replace_decorator(TemplateView.as_view(
         template_name="hoge-page")),
     name='hoge-page'),
</pre>
<p>▲ We will use a decorator to perform string replacement in the output result in this form.</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>Method 2: Create a class that inherits from TemplateView</h3>
<pre class="literal-block">url(r'^hoge-page/$',
     TemplateView.as_view(
         template_name="hoge-page"),
     name='hoge-page'),
</pre>
<p>▲ Change this to:</p>
<pre class="literal-block">url(r'^hoge-page/$',
     ContentReplaceTemplateView.as_view(
         template_name="hoge-page"),
     name='hoge-page'),
</pre>
<p>▲ Consider a class that performs string replacement in the output result.</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>In any case, the key point is to insert the conversion method into the add_post_render_callback of the HttpResponse instance.</p>
<p>If you try to directly manipulate the content of the HttpResponse instance without doing this, an exception will be raised.</p>
</div>
</div>
Current rating: 1
The author runs the application development company Cyberneura.
We look forward to discussing your development needs.

Comments

Archive

2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011