Python 在Django表单中插入标题

Python 在Django表单中插入标题,python,django,forms,Python,Django,Forms,我希望我的表单输出如下内容: Name: ___________ Company: ___________ Interested in ------------- Foo: [ ] Bar: [ ] Baz: [ ] from django.forms import Form from formfieldset.forms import FieldsetMixin class MyForm(Form, FieldsetMixin): fieldsets = ( (

我希望我的表单输出如下内容:

Name: ___________
Company: ___________

Interested in
-------------
Foo: [ ]
Bar: [ ]
Baz: [ ]
from django.forms import Form
from formfieldset.forms import FieldsetMixin


class MyForm(Form, FieldsetMixin):
    fieldsets = (
        (u'', {'fields': ['name', 'company']}),
        (u'Interested in', {'fields': ['foo', 'bar', 'baz']}),
    )

    # rest of the form

也就是说,我希望把“感兴趣”的标题插入到表单输出的中间。

一种方法是写出每个字段的模板代码,并根据需要插入标题。然而,我不想这样做。我怀疑表单集与我想做的事情有关

有没有什么方法可以满足我的需求,或者我只需要接受它,接受我需要为它直接编写模板的事实?

你可以获得类似管理员的字段集。您可以这样创建表单:

Name: ___________
Company: ___________

Interested in
-------------
Foo: [ ]
Bar: [ ]
Baz: [ ]
from django.forms import Form
from formfieldset.forms import FieldsetMixin


class MyForm(Form, FieldsetMixin):
    fieldsets = (
        (u'', {'fields': ['name', 'company']}),
        (u'Interested in', {'fields': ['foo', 'bar', 'baz']}),
    )

    # rest of the form

表单字段保留定义表单类或模型的顺序(如果它是form for model)。在模板中,您可以迭代所有指定如何渲染的字段,您可以使用ifequal标记检查要查找的字段,并指定不同的渲染

见:


Django表单集不是一种好方法:如果需要同时编辑多个对象,可以使用它们。HTML字段集更像是正确的方式。我想您可以将名称和公司字段分组到一个字段集中,然后将兴趣字段分组到另一个字段集中

在DjangoSnippets上,您可以找到一个

使用此代码段,您可以将视图中的分组定义为

fieldsets = (
    ('', {'fields': ('name','company')}),
    ('Interested in', {'fields': ('foo','bar','baz')})
)
将其与表单一起传递到模板,并使用

{% draw_form form fieldsets %}
我不希望在视图中定义分组,因为它主要是表示问题,应该属于视图,但见鬼,这似乎可以完成任务


虽然muhuk的解决方案看起来比这更优雅…

这有点像黑客,但您可以定义一个只呈现其值的
HeaderWidget

from django.forms.util import flatatt
from django.utils.html import format_html

class HeaderWidget(forms.widgets.Widget):
    def render(self, name, value, attrs=None):
        attrs.update(self.attrs)
        return format_html('<div{0}>{1}</div>', flatatt(attrs), value)

一个小缺点是,您会在表单中看到标题“value”。

我认为它属于表单,因为foo、bar和baz字段在概念上是相关的,我不想插入标题以使其看起来更好。无论如何,我会在喝过早餐咖啡后看看这些解决方案。:)适用于向表单添加虚拟标题。