새로운 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을 사용하지 말라고 말합니다. 항상 대신 템플릿을 사용하십시오.
템플릿 시스템은 사물이 적절하게 이스케이프되므로 걱정할 필요가 없으며 프로그래머가 여러 if
s 및 사용자 로 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
'Nice programing' 카테고리의 다른 글
pkl 파일의 압축을 푸는 방법은 무엇입니까? (0) | 2020.11.27 |
---|---|
자바 스크립트 세트 대 어레이 성능 (0) | 2020.11.27 |
핵심 데이터를 미리 채우는 방법이 있습니까? (0) | 2020.11.27 |
urllib2의 시간 초과 처리? (0) | 2020.11.27 |
Rails : Partials는 인스턴스 변수를 인식해야합니까? (0) | 2020.11.26 |