将标题插入Django表单

时间:2009-03-11 17:37:14

标签: python django forms

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

Name: ___________
Company: ___________

Interested in
-------------
Foo: [ ]
Bar: [ ]
Baz: [ ]

也就是说,我希望在表单输出的中间插入'感兴趣'标题。

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

有办法做我想做的事情,或者我只是需要吮吸它并接受我需要为此手写我的模板吗?

4 个答案:

答案 0 :(得分:3)

使用FieldsetMixin,您可以获得类似管理员的字段集。您可以像这样创建表单:

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

答案 1 :(得分:3)

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

在DjangoSnippets上,您可以找到template tag that aids the grouping

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

fieldsets = (
    ('', {'fields': ('name','company')}),
    ('Interested in', {'fields': ('foo','bar','baz')})
)

将其与表单一起传递给模板,然后使用

呈现表单
{% draw_form form fieldsets %}

我不希望在视图中定义分组,因为它主要是表示性问题,应该属于视图,但是,这似乎可以做到这一点!

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

答案 2 :(得分:0)

表单字段保留您定义表单类或模型的顺序(如果它是模型的表单)。在模板中,您可以通过指定它们如何呈现的所有字段进行迭代,您可以使用ifequal标记检查您要查找的字段,并指定不同的呈现。

请参阅:

http://docs.djangoproject.com/en/dev/topics/forms/?from=olddocs#looping-over-the-form-s-fields

答案 3 :(得分:0)

这有点像黑客攻击,但您可以定义一个只显示其值的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)

然后使用该窗口小部件在所需位置添加字段:

header = forms.CharField(
    widget=HeaderWidget(attrs={'class': 'my-css-class'}),
    initial='Interested in',
    required=False,
    label='')

一个小缺点是你会在你的表单中找到标题“值”。