我希望在django表单字段的<ul>
内有一个help_text
。
不幸的是,django在help_text
内呈现<span>
。
根据HTML规范,<span>
不得包含<ul>
。至少这是我的验证工具所说的。
以下是django的来源:https://github.com/django/django/blob/master/django/forms/forms.py#L283
def as_table(self):
"Return this form rendered as HTML <tr>s -- excluding the <table></table>."
return self._html_output(
normal_row='<tr%(html_class_attr)s><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>',
error_row='<tr><td colspan="2">%s</td></tr>',
row_ender='</td></tr>',
help_text_html='<br><span class="helptext">%s</span>',
errors_on_separate_row=False)
如何在<ul>
和有效的html中获取help_text
。
覆盖as_table()
不起作用,因为表单来自&#34; core_app&#34;该字段来自插件。两者都是两个不同的git回购,我不想因此而修改核心。
答案 0 :(得分:9)
正如您已经提到的,在HTML中有一个阻止和内嵌元素的概念。
简而言之,块元素生成一个新行,并可能包含其他块和内联元素。内联元素不会生成新行,并且可能包含其他内联元素,但不包含块元素。
MDN网络文档提供了有关block和inline元素的更多信息。
由于span
是内联元素,因此您不能将ul
放在块内元素中。或者,你可以,但那时它不是一个有效的HTML,而这不是你想要的。
由于您使用的是第三方代码,修改它可能会引入其他问题 你可以分叉,修改你需要的部件,然后使用你的叉子。但是当第三方代码更新时,您必须重复整个过程。
在这种情况下你可以做monkey patching 对于您的特定问题,我们可以这样做:
from django import forms
class MyBaseForm(forms.BaseForm):
def as_table(self):
"Return this form rendered as HTML s -- excluding the ."
return self._html_output(
normal_row='%(label)s%(errors)s%(field)s%(help_text)s',
error_row='%s',
row_ender='',
help_text_html='<div class="helptext">%s</div>',
errors_on_separate_row=False)
BaseForm.as_table = MyBaseForm.as_table
您可以将此代码放在forms.py
或任何其他适合您的文件中。
现在help_text
将呈现为div
元素,这是一个块级元素。您可以在其中放置无序列表ul
并拥有有效的HTML。
猴子补丁并不是解决问题的最佳方式,但在我看来,这是克服一些棘手问题的实用方法。
答案 1 :(得分:5)
我认为你想要的并不完全是help_text
&#34; as_table()
&#34;而是#34;在帮助文本中显示一个项目符号列表&#34;。
因此,如果您无法覆盖as_table()
或使用ul
以外的其他内容,我希望您仍然可以更改样式表。在这种情况下,您可以使用span
伪造from django.utils.safestring import mark_safe
help_text=mark_safe(
'<span class="fake-ul">'
'<span class="fake-li">foo</span>'
'<span class="fake-li">bar</span>'
'</span>'
)
:
.fake-ul {
display: block;
padding-left: 40px;
list-style-type: disc;
}
.fake-li {
display: list-item;
}
这是你的CSS:
GridView
答案 2 :(得分:2)
所以可能为时已晚,但我认为您可能会发现Django widget tweaks有用。