W mojej aplikacji internetowej użytkownik może pisać posty na blogu. Gdy wyświetlam wpis na blogu, znaki nowej linii nie są wyświetlane, ponieważ nie zastąpiłem nowych linii znacznikami <br>
. Problem polega na tym, że w Jinji zmieniłem autoescaping, więc tagi <br>
są chronione. Nie chcę tymczasowo wyłączać autoescaping, chcę konkretnie dopuszczać tagi <br>
. Jak to zrobić?Zezwalanie na znaczniki <br> z Google App Engine i Jinja2
Odpowiedz
mam inną odpowiedź, która moim zdaniem jest najlepszy. Początkowo wyświetlałem moją zmienną post.content
tak jak jest, a nowe znaki nie były zachowywane. Żadne z rozwiązań tutaj nie działało (dobrze), a moje wcześniejsze rozwiązanie było po prostu szybką naprawą i miało poważne problemy. To jest prawdziwe rozwiązanie:
{% for line in post.content.splitlines() %}
{{line}}<br>
{% endfor %}
Świetne rozwiązanie! – billwild
Dzięki temu działa! –
Rozwiązaniem było umieszczenie tagów <pre></pre>
wokół obszaru, w którym miałem zawartość.
To nie jest świetne rozwiązanie - pre ma wpływ na inne rzeczy, takie jak zawijanie linii. –
Najprostszym sposobem, aby to zrobić, jest samodzielne wyjście z pola, a następnie dodanie podziałów linii. Kiedy przekażesz go w jinja, oznacz go jako bezpieczny, aby nie był autoescaped.
Można użyć filtru |safe
lub użyj autoescape bloków:
{% autoescape false %}
{{ content goes here }}
{% autoescape %}
Można również ustawić autoescaping w environment do False
.
w modelu obiektu, dodać funkcję tak:
class Post(db.Model):
# ...
def html_content(self):
# Escape, then convert newlines to br tags, then wrap with Markup object
# so that the <br> tags don't get escaped.
def escape(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>'))
Następnie w szablonie, wystarczy zadzwonić, że:
<p>{{ post.html_content() }}</p>
Można utworzyć filtr jinja2:
import re
from jinja2 import evalcontextfilter, Markup, escape
_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')
@evalcontextfilter
def nl2br(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
trzeba dodać filtr do jinja2 Środowiska, zanim będzie można go używać:
JINJA2_ENV.filters['nl2br'] = jinja2_filters.nl2br
W swoim szablonie możesz użyć tego filtra:
{{post.content|nl2br}}
Oto filtr napisał o sobie:
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)
return result
i dodać filtr do jinja2.Environment()
pod numerem:
jinja_env.filters['nl2br'] = nl2br
Należy pamiętać, że jest to niebezpieczne, ponieważ przechodzi treść HTML. Powinno być: result = escape (value) .replace ("\ n", Markup ("
")) –
gpothier
Zauważ, że mam autoescape domyślnie, więc nie sprawdzić w funkcja ta, ale to jest to, czego używam
def nl2br(value):
split = value.split('\n')
return jinja2.Markup('<br>').join(split)
wtedy oczywiście
jinja_env.filters['nl2br'] = nl2br
- 1. TemplateNotFound: index.html z Google App Engine i Jinja2
- 2. Nie można załadować jinja2 z webapp2/Google App Engine
- 3. Google App Engine APNS
- 4. Google App Engine Geohashing
- 5. Google App Engine
- 6. Google App Engine: get_or_create()?
- 7. Zabezpieczenia oparte na rolach z Google App Engine i Pythonem
- 8. Google App Engine i najlepsze praktyki Git
- 9. Google App Engine i obsługa Django
- 10. Aplikacja RESTful na Google App Engine Java?
- 11. App Engine i Google Drive API
- 12. Google App Engine, JDO i equals/hashCode
- 13. Google App Engine Konwerter PDF
- 14. Uruchamianie Boto na Google App Engine (GAE)
- 15. Google App Engine vs WebFaction
- 16. Google App Engine lub Django?
- 17. Google App Engine kopiowanie nadawcy
- 18. web.py w Google App Engine
- 19. Google App Engine na platformie Silverlight
- 20. łata teleskopowa na Google App Engine WebApp2
- 21. Google App Engine JDO 3
- 22. Google App Engine dziwne opóźnienie
- 23. Google App Engine z obsługą PHP 7
- 24. Google App Engine/_ah/zdrowie
- 25. Retrolambda w Google App Engine
- 26. Google App Engine wiele regionów
- 27. Jak korzystać z inwazyjnych szablonów templatetag w google-app-engine
- 28. Google Cloud Datastore vs Google App Engine
- 29. Usługi internetowe z Google App Engine
- 30. OpenID dla Google App Engine
Możesz użyć 'textarea', jeśli chcesz, aby znaki nowej linii były szanowane. – bossylobster