Как ввести HTML в текст справки поля формы Django?
Я попытался создать текст справки для поля выбора в моей форме Django с помощью
i_agree = forms.CharField(label="", help_text="Initial to affirm that you agree to the <a href='/contract.pdf'>contract</a>.", required=True, max_length="4")
Однако необработанный HTML отображается как результат в тексте справки. Как ввести HTML в текст справки поля формы Django?
Ответы
Ответ 1
Вы можете использовать mark_safe
в модели, чтобы указать, что html безопасен, и его следует интерпретировать как таковой:
from django.utils.safestring import mark_safe
i_agree = forms.CharField(label="", help_text=mark_safe("Initial to affirm that you agree to the <a href='/contract.pdf'>contract</a>."), required=True, max_length="4")
Ответ 2
Вы также можете пометить его как безопасный в шаблоне, если вы сами зацикливаете форму:
{% for f in form %}
{{f.label}}{{f}}{{f.help_text|safe}}
{%endfor%}
Это очень простой пример этого в шаблоне. Вам нужно будет сделать больше, чтобы это выглядело хорошо.
Ответ 3
Вы можете использовать внешний файл для повышения удобства обслуживания и разделения проблем:
- изменить метод формы
__init__()
;
- после
super(MyForm, self).__init__(*args, **kwargs)
;
- присвойте результат
render_to_string()
self.fields['my_field'].help_text
.
forms.py
из django.template.loader import render_to_string
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
# Only in case we build the form from an instance,
if 'instance' in kwargs and kwargs['instance'].nature == consts.RiskNature.RPS:
self.fields['my_field'].help_text = render_to_string('components/my-template.html')
# ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
мой-template.html
{% load i18n %}
<table class="table table-bordered">
<tr>
<th>{% trans 'Externe' %}</th>
</tr>
<tbody class="text-muted">
<tr>
<td>{% trans "En lien avec les relations de travail" %}</td>
</tr>
<tr>
<td>{% trans "-" %}</td>
</tr>
</tbody>
</table>
Ответ 4
Использовать тег textarea с readonly
<textarea readonly> <p>stuff</p> </textarea>