Django:<ul>里面的help_text字段

时间:2018-03-12 13:42:59

标签: html django django-forms

我希望在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回购,我不想因此而修改核心。

3 个答案:

答案 0 :(得分:9)

正如您已经提到的,在HTML中有一个阻止内嵌元素的概念。
简而言之,块元素生成一个新行,并可能包含其他块和内联元素。内联元素不会生成新行,并且可能包含其他内联元素,但不包含块元素。

MDN网络文档提供了有关blockinline元素的更多信息。

由于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有用。