我希望我的表单输出如下内容:
Name: ___________
Company: ___________
Interested in
-------------
Foo: [ ]
Bar: [ ]
Baz: [ ]
也就是说,我希望在表单输出的中间插入'感兴趣'标题。
这样做的一种方法是为每个字段写出模板代码,并根据需要插入标题。但是,我不想这样做。我怀疑与表格集有关,可以做我想做的事。
是有办法做我想做的事情,或者我只是需要吮吸它并接受我需要为此手写我的模板吗?
答案 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='')
一个小缺点是你会在你的表单中找到标题“值”。