كيفية تعطيل ترميز HTML عند استخدام السياق في Django
-
04-07-2019 - |
سؤال
في تطبيق Django الخاص بي ، أستخدم قالبًا لإنشاء هيكل البريد الإلكتروني ، أحد المعلمات هو عنوان URL ، لاحظ أن هناك معلمتان مفصولين بواسطة ampersand في عنوان URL.
t = loader.get_template("sometemplate")
c = Context({
'foo': 'bar',
'url': 'http://127.0.0.1/test?a=1&b=2',
})
print t.render(c)
بعد تقديمه ينتج: http://127.0.0.1/test?a=1&b=2
لاحظ أن ampersand هو HTML مشفرة على أنها "&". تتمثل إحدى الطرق حول المشكلة في تمرير كل معلمة بشكل منفصل إلى القالب الخاص بي وبناء عنوان URL في القالب ، ومع ذلك أود تجنب القيام بذلك.
هل هناك طريقة لتعطيل تشفير HTML لمعلمات السياق أو على الأقل تجنب ترميز ampersands؟
المحلول
لإيقاف تشغيله لمتغير واحد ، استخدم mark_safe
:
from django.utils.safestring import mark_safe
t = loader.get_template("sometemplate")
c = Context({
'foo': 'bar',
'url': mark_safe('http://127.0.0.1/test?a=1&b=2'),
})
print t.render(c)
بدلاً من ذلك ، لإيقاف التشغيل تمامًا من رمز Python الخاص بك ، استخدم ال autoescape
الحجة عند تهيئة أ Context
:
c = Context({
'foo': 'bar',
'url': 'http://127.0.0.1/test?a=1&b=2',
}, autoescape=False)
ال كيفية تشغيل [هروب HTML التلقائي] قبالة يغطي قسم الوثائق بعض الخيارات الموجودة في العلم إذا كنت تفضل القيام بذلك هناك.
نصائح أخرى
أو مجرد استخدام مرشح "آمن" في القالب الخاص بك.
أيضًا ، لا يمكنني التأكيد بما فيه الكفاية على مدى أهمية أن أكون على دراية بوثائق Django ؛ العديد من الأسئلة الشائعة مثل هذه لها إجابات وتفسيرات سهلة الثقة (مثل هذه) ، وقراءة المستندات والإحساس بكيفية عمل كل شيء ، سوف يقلل بشكل كبير من الوقت الذي تحتاجه لإنفاقه "لماذا فعلت ذلك" وزيادة مقدار الوقت الذي تقضيه في بناء الأشياء التي تعمل بالطريقة التي تريدها .