Nice programing

새로운 Django 메시지 프레임 워크의 메시지에 HTML을 어떻게 출력합니까?

nicepro 2020. 11. 27. 21:22
반응형

새로운 Django 메시지 프레임 워크의 메시지에 HTML을 어떻게 출력합니까?


새로운 Django 메시지 프레임 워크를 통해 표시되는 메시지에 약간의 html을 표시하려고합니다. 특히 messages ()를 둘러싼 얇은 래퍼 인 ModelAdmin.message_user 메서드를 통해이 작업을 수행하고 있습니다.

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 %}

그래서 내가 뭘 잘못하고 있는지 정확히 모르겠습니다.

생각이나 안내에 감사드립니다!


또 다른 옵션은 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 %}

다음 Django 티켓에서 언급했듯이 SessionStorage 백엔드와 함께 mark_safe ()를 사용하면 작동합니다. https://code.djangoproject.com/ticket/14976#comment:9


시도해 보셨습니까 {{ message | safe }}?

Django 템플릿 시스템에서 템플릿 변수는 필터 로 안전하다고 지정하지 않는 한 항상 이스케이프 처리 safe됩니다. 이 기본값은 인젝션 공격으로부터 인식하지 못하는 사람도 보호합니다.

나는 그것이 mark_safe와 어떻게 상호 작용하는지 확실하지 않지만 아마도 그 사이에 무언가가 발생하여 다시 안전하지 않게 만들었습니다.


이것은 나를 위해 일했습니다 (Django 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>'))

관리자 목록에서 이스케이프 처리되지 않은 HTML을 사용하는 방법을 찾고있었습니다. 이것이 메시지 프레임 워크에 적용되는지 확실하지 않지만 여기에 설명 된대로 allow_tags를 사용하면 도움이되었습니다.

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


템플릿 시스템의 전체 요점은 이와 같은 문자열과 데이터를 처리하는 것입니다.

다른 모든 답변은 빌드 된 문자열을 안전한 것으로 표시하도록 지시하지만 한 단계 더 나아가 코드에서 HTML을 사용하지 말라고 말합니다. 항상 대신 템플릿을 사용하십시오.

템플릿 시스템은 사물이 적절하게 이스케이프되므로 걱정할 필요가 없으며 프로그래머가 여러 ifs 및 사용자 로 HTML 문자열을 작성하는 상황에 들어가는 것이 훨씬 더 어렵습니다. 데이터.

app/templates/app/fragments/google_link.html:

<a href="https://www.google.com">Here's Google!</a>

views.py:

from django.template import loader

...

def view(request):
    messages.info(
        request,
        loader.render_to_string(
            'app/fragments/google_link.html',
            {},
            request=request,
        ),
    )

format_html 을 사용할 수 있습니다 . 모든 인수에 이스케이프를 적용합니다.

예를 들어, 속성 호출 'name'을 사용하여 'mymodel'세부 사항과 연결할 수있는 경우 :

from django.contrib import messages
from django.utils.html import format_html


message = format_html("{} <a href='{}'>{}</a>",
                      "This is the mymodel", 
                      reverse('myapp:mymodel-detail', args=(mymodel.id,)),
                      mymodel.name)
messages.info(request, message)

This answer is based on https://stackoverflow.com/a/33751717/3816639

참고URL : https://stackoverflow.com/questions/2053258/how-do-i-output-html-in-a-message-in-the-new-django-messages-framework

반응형