Porównaj ceny domen i usług IT, sprzedawców z całego świata

Jak wyświetlić HTML w poście w nowej strukturze postów Django?


Próbuję wyświetlić jakiś html w poście, który jest wyświetlany za pośrednictwem nowej struktury postów Django. W szczególności robię to za pomocą metody ModelAdmin.message_user, która jest tylko cienkim opakowaniem wokół wiadomości ():
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)

Wszystko, czego do tej pory próbowałem, wydaje się pokazywać Escape HTML.
self.message_user(request, "[url=\"[url=http://www.google.com]http://www.google.com[/url]\">Here's google![/url]")

Nie działa i nie działa:
from django.utils.safestring import mark_safe...
self.message_user(request, mark_safe("[url=\"[url=http://www.google.com]http://www.google.com[/url]\">Here's google![/url]"))

Wyświetlanie kodu szablonu w szablonie admin base.html jest całkiem proste:
{% if messages %}
<ul class="messagelist">{% for message in messages %}[*]{{ message }}[/*]{% endfor %}[/list]
{% endif %}

Więc nie jestem pewien, co robię źle.
Mile widziane przemyślenia lub wskazówki, dzięki!
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Inną opcją jest użycie słowa kluczowego
extra_tags
arg, aby wskazać, że wiadomość jest bezpieczna. Dawny.
messages.error(request, 'Here is a [url="/">link[/url]', extra_tags='safe')

następnie użyj logiki standardowej, aby użyć bezpiecznego filtra
{% for message in messages %}
<li class="{{ message.tags }}">
{% if 'safe' in message.tags %}{{ message|safe }}{% else %}{{ message }}{% endif %}
[/*]
{% endfor %}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak zauważono w poniższym zgłoszeniu Django, powinno działać, jeśli używasz mark_safe () w połączeniu z zapleczem SessionStorage:

https://code.djangoproject.com ... ent:9
https://code.djangoproject.com ... ent:9
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Czy próbowałeś
{{message | safe}}
?
W systemie szablonów Django zmiennymi szablonu są

jest zawsze

są zmieniane, chyba że określisz je jako bezpieczne przy użyciu filtra
safe
. To ustawienie domyślne sprawia, że ​​nawet nieświadomi ludzie są odporni na ataki iniekcyjne.
Nie jestem pewien, jak to współdziała z mark_safe, ale możliwe, że wydarzyło się coś pomiędzy nimi, co sprawiło, że znów stał się niepewny.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To zadziałało dla mnie (Django 1.11):
from django.contrib import messages
from django.utils.safestring import mark_safemessages.info(request, mark_safe('This is link to [url="[url=http://google.com">http://google.com]http://google.com">http://google.com[/url][/url]'))
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

możesz użyć

format_html
https://docs.djangoproject.com ... html. Dotyczy ekranowania do wszystkich argumentów.
Na przykład, jeśli możemy utworzyć link do części „mymodel” za pomocą atrybutu wywołania „name”:
from django.contrib import messages
from django.utils.html import format_html
message = format_html("{} [url='{}'>{}[/url]",
"This is the mymodel",
reverse('myapp:mymodel-detail', args=(mymodel.id,)),
mymodel.name)
messages.info(request, message)

Ta odpowiedź opiera się na

https://stackoverflow.com/a/33751717/3816639
https://stackoverflow.com/a/33751717/3816639
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Szukałem sposobu na użycie kodu HTML bez zmiany znaczenia na liście administratorów. Nie jestem pewien, czy dotyczy to struktury przesyłania wiadomości, ale użycie allow_tags, jak opisano tutaj, pomogło mi.
http://urlenodode.blogspot.com ... html.
http://urlencode.blogspot.com/ ... .html
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Cały sens systemu szablonów polega na radzeniu sobie z ciągami znaków i takimi danymi.
Podczas gdy każda inna odpowiedź instruuje cię, aby oznaczyć skonstruowany ciąg jako bezpieczny, pójdę o krok dalej i powiem ci, aby nigdy nie używać HTML w swoim kodzie - zawsze używaj zamiast tego szablonu.
System szablonów zapewnia, że ​​wszystko jest poprawnie ucieczki, więc nie musisz się tym martwić, a programista jest znacznie trudniejszy, aby dostać się do sytuacji, w której tworzy łańcuch HTML z paczki
if
s i dane użytkownika. [/code]
app/templates/app/fragments/google_link.html
:
[url="[url=https://www.google.com">Her]https://www.google.com">Her[/url]e's Google![/url]

views.py
:
<pre class="lang-py prettyprint-override">
from django.template import loader...def view(request):
messages.info( request,
loader.render_to_string( 'app/fragments/google_link.html',
{},
request=request,
),
)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak zostało powiedziane

Tutaj
https://coderoad.ru/2053258/
Ryan Kasku, poprawnym sposobem jest użycie
{{message.message}}
zamiast
{{message}}
.
<pre class="lang-py prettyprint-override">
{% if messages %}
<ul class="messagelist">
{% for message in messages %}
[*]{{ message.message }}[/*]
{% endfor %}
[/list]
{% endif %}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się