Skip to content Skip to sidebar Skip to footer

Allowing
Tags With Google App Engine And Jinja2

In my web app, the user can make blog posts. When I display the blog post, newlines aren't shown because I didn't replace the new lines with tags. The problem is that I'

Solution 1:

I have another answer that I think is the best. Initially I was just displaying my variable post.content as-is, and the newlines weren't being preserved. None of the solutions here worked (well), and my pre solution was just a quick fix and had major issues. This is the real solution:

{% for line in post.content.splitlines() %}
    {{line}}<br>
{% endfor %}

Solution 2:

You can use the |safe filter, or use the autoescape blocks:

{% autoescape false %}
{{ content goes here }}
{% autoescape %}

You could also set autoescaping in the environment to False.

Solution 3:

In your model object, add a function like this:

classPost(db.Model):# ...defhtml_content(self):
        # Escape, then convert newlines to br tags, then wrap with Markup object# so that the <br> tags don't get escaped.defescape(s):
            # unicode() forces the conversion to happen immediately,# instead of at substitution time (else <br> would get escaped too)return unicode(jinja2.escape(s))
        return jinja2.Markup(escape(self.content).replace('\n', '<br>'))

Then in your template, just call that:

<p>{{ post.html_content() }}</p>

Solution 4:

You can create a jinja2 filter:

import re
from jinja2 import evalcontextfilter, Markup, escape

_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')

@evalcontextfilterdefnl2br(eval_ctx, value):
    result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n')
                          for p in _paragraph_re.split(escape(value)))
    if eval_ctx.autoescape:
        result = Markup(result)
    return result

You need to add the filter to your jinja2 Environment before you can use it:

JINJA2_ENV.filters['nl2br'] = jinja2_filters.nl2br

In your template you can use that filter:

{{post.content|nl2br}}

Solution 5:

Here's a filter wrote by myself:

import jinja2

@jinja2.evalcontextfilter
def nl2br(eval_ctx, value):
    result= jinja2.escape(value).unescape().replace('\n', '<br>')
    if eval_ctx.autoescape:
        result= jinja2.Markup(result)
    returnresult

And add the filter to the jinja2.Environment() by calling:

jinja_env.filters['nl2br'] = nl2br

Post a Comment for "Allowing
Tags With Google App Engine And Jinja2"