Ответ 1
Как вы уже упоминали, в HTML есть понятие блочных и встроенных элементов.
В коротких блочных элементах создается новая строка и может содержать другие блок и встроенные элементы. Встроенные элементы не генерируют новую строку и могут содержать другие встроенные элементы, но не блокировать элементы.
Веб-документы MDN предоставляют дополнительную информацию о блочных и встроенных элементах.
Поскольку span
является встроенным элементом, вы не можете поместить ul
который является элементом уровня блока внутри. Или, вы могли бы, но тогда это не действительный HTML, и это не то, что вы хотите.
Поскольку вы используете сторонний код, модификация может привести к другим проблемам.
Вы можете разветкить его, изменить нужные части, а затем использовать свою вилку. Но когда этот сторонний код обновляется, вам нужно повторить весь процесс.
В таких случаях вы могли бы просто сделать исправление обезьяны.
Для вашей конкретной проблемы мы могли бы сделать что-то вроде этого:
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.
Патч обезьяны - не самый красивый способ решения проблем, но это, на мой взгляд, прагматичный способ преодолеть некоторые сложные проблемы.