การแสดงผลตัวแปรเทมเพลตเป็น HTML


186

ฉันใช้อินเทอร์เฟซ 'ข้อความ' เพื่อส่งต่อข้อความไปยังผู้ใช้เช่นนี้:

request.user.message_set.create(message=message)

ฉันต้องการรวม html ใน{{ message }}ตัวแปรของฉันและแสดงโดยไม่ต้องมาร์กอัปในเทมเพลต

คำตอบ:


333

หากคุณไม่ต้องการให้ HTML ถูก Escape ให้ดูที่safeตัวกรองและautoescapeแท็ก:

safe:

{{ myhtml |safe }}

autoescape:

{% autoescape off %}
    {{ myhtml }}
{% endautoescape %}

หากคุณต้องการแสดงเช่นสัญลักษณ์สกุลเงินเช่นยูโร ( €) เงินดอลลาร์ที่ผ่านมาจากมุมมองนี้เป็นวิธีที่จะไป
andilabs

ทราบว่าเป็นและไม่ได้autoescape off onฉันทำผิดพลาดและค้นพบในภายหลังเท่านั้น
Anupam

37

หากคุณต้องการทำสิ่งที่ซับซ้อนมากขึ้นกับข้อความของคุณคุณสามารถสร้างตัวกรองของคุณเองและทำเวทมนต์ก่อนที่จะส่งคืน html ด้วยไฟล์ templatag ที่มีลักษณะดังนี้:

from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter
def do_something(title, content):

    something = '<h1>%s</h1><p>%s</p>' % (title, content)
    return mark_safe(something)

จากนั้นคุณสามารถเพิ่มสิ่งนี้ในไฟล์แม่แบบของคุณ

<body>
...
    {{ title|do_something:content }}
...
</body>

และนี่จะให้ผลลัพธ์ที่ดีแก่คุณ


30

คุณสามารถแสดงเทมเพลตในรหัสของคุณดังนี้:

from django.template import Context, Template
t = Template('This is your <span>{{ message }}</span>.')

c = Context({'message': 'Your message'})
html = t.render(c)

ดูเอกสาร Djangoสำหรับข้อมูลเพิ่มเติม


ฉันคิดว่าฉันผิดที่ผิดที่นี่ แต่ฉันออกจากคำตอบตอนนี้
มาร์คัส Whybrow



6

ไม่จำเป็นต้องใช้ตัวกรองหรือแท็กในแม่แบบ เพียงใช้ format_html () เพื่อแปลตัวแปรเป็น html และ Django จะปิดการหลบหลีกโดยอัตโนมัติสำหรับคุณตัวแปร

format_html("<h1>Hello</h1>")

ลองดูที่นี่https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.html.format_html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.