Как вывести HTML в сообщении в новой структуре сообщений Django? - PullRequest
60 голосов
/ 13 января 2010

Я пытаюсь отобразить немного html в сообщении, которое отображается через новую структуру сообщений Django. В частности, я делаю это с помощью метода ModelAdmin.message_user, который является простой оболочкой для messages ():

def message_user(self, request, message):
    """
    Send a message to the user. The default implementation
    posts a message using the django.contrib.messages backend.
    """
    messages.info(request, message)

Все, что я пробовал до сих пор, похоже, отображает экранированный HTML.

self.message_user(request, "<a href=\"http://www.google.com\">Here's google!</a>")

Не работает и не работает:

from django.utils.safestring import mark_safe
...
self.message_user(request, mark_safe("<a href=\"http://www.google.com\">Here's google!</a>"))

Отображение кода шаблона в шаблоне admin base.html довольно просто:

    {% if messages %}
    <ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>
    {% endif %}

Так что я не совсем уверен, что я делаю неправильно.

Мысли или руководство с благодарностью, спасибо!

Ответы [ 5 ]

69 голосов
/ 12 апреля 2012

Другой вариант - использовать extra_tags ключевое слово arg, чтобы указать, что сообщение безопасно. Например,

messages.error(request, 'Here is a <a href="/">link</a>', extra_tags='safe')

затем используйте логику шаблона для использования безопасного фильтра

{% for message in messages %}
    <li class="{{ message.tags }}">
    {% if 'safe' in message.tags %}{{ message|safe }}{% else %}{{ message }}{% endif %}
    </li>
{% endfor %}
21 голосов
/ 04 января 2012

Как отмечено в следующем билете Django, он должен работать, если вы используете mark_safe () в сочетании с бэкэндом SessionStorage: https://code.djangoproject.com/ticket/14976#comment:9

16 голосов
/ 13 января 2010

Вы пробовали {{ message | safe }}?

В шаблонной системе Django переменные шаблона всегда экранированы, если вы не указали их как безопасные с фильтром safe. Это значение по умолчанию защищает даже не подозреваемых от атак с использованием инъекций.

Я не уверен, как это взаимодействует с mark_safe, но, возможно, что-то произошло между ними, что снова сделало его небезопасным.

6 голосов
/ 04 апреля 2018

Это сработало для меня (Джанго 1.11):

from django.contrib import messages
from django.utils.safestring import mark_safe

messages.info(request, mark_safe('This is link to <a href="http://google.com">http://google.com</a>'))
0 голосов
/ 14 января 2010

Я искал способ использовать неэкранированный HTML-код в списке администратора. Не уверен, относится ли это к структуре сообщений, но мне помогло использование allow_tags, как описано здесь.

http://urlencode.blogspot.com/2009/10/neat-django-admin-tricks-part-1.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...