我有一个相对复杂的表单,该表单在我的网站上的多个地方都使用过(实际上,它是许多其他表单类从中继承的表单)。在模板中,此表单的继承部分始终采用相同的格式设置-但涉及到某种格式设置;每个字段均已呈现并手动定位在模板中。
这意味着显示该表单的每个模板都具有许多相同的HTML标记,这些标记可以适当地呈现该表单。
我想创建一个可以调用的自定义输出,类似于as_table()
方法。我知道一个人可以覆盖normal_row
,error_row
等属性-但是此表单的格式超出了(例如,表单的五个字段中的三个应并排打印-端,带有合并标题)。我见过的所有教程/已回答的问题都涉及覆盖上述属性,或提供有关如何手动呈现表单的说明。
最初,我在想这样的事情:
Class StrangeForm(form.Forms):
....
def as_table_custom():
html_string = "\
<tr><td>Title 1:</td><td>self.fields['field1']</td><tr>\
<tr><td>Title 2:</td><td>self.fields['field2']</td><tr>\
<tr><td>Titles 3, 4, 5:</td><td>self.fields['field3']\
</td><td>self.fields['field4']</td><td>self.fields['field5']</td></tr>\
"
return html_string
但是,在通读Django's forms.py file的_html_output()
和as_table()
方法之后,看起来并不那么容易。如果我从头开始编写此代码,则必须以某种方式解决错误,帮助文本等问题。我认为。
是否有一种简单的方法可以覆盖某些内容,以便可以像上面那样定义表单的HTML输出?还是我必须从头开始重写东西。如果是后者,我该如何解释我需要解释的所有事情?
答案 0 :(得分:1)
我不会采用这种方法。最好在包含要以这种方式显示表单的各种模板中包含的HTML模板中创建表单。
因此,请创建一个my_strange_form.html模板,在该模板中,您假定在上下文中使用正确数量的字段传递了一个“ form”对象。在该模板中,只需使用{{ field.label_tag }}
和{{ field }}
之类的内容创建HTML。您可以使用{% for field in form %}
遍历字段,并使用{{ forloop.counter }}
检查循环计数器。我预见到很多{% if forloop.counter... %}
语句会生成合并的行,并且看起来很丑陋,但是您只需要看一次即可:-)
然后在您的主模板{% include 'my_strange_form.html' with form=form %}
中。