我知道您可以在django中为Admin帮助程序指定字段集.但是,我找不到任何对ModelForms有用的东西.只是一些我无法使用的补丁.我错过了什么吗?有没有一种方法可以实现像fieldset这样的东西,而无需在相应的标签中手动写出模板上的每个字段.
理想情况下,我想迭代一组BoundFields.但是,在我的ModelForm结束时做这样的事情:
fieldsets = [] fieldsets.append(('Personal Information', [username,password,password2,first_name,last_name,email]),) # add a 2 element tuple of string and list of fields fieldsets.append(('Terms & Conditions', [acceptterms,acceptprivacy]),) # add a 2 element tuple of string and list of fields
失败,因为我的数据结构中包含的项目是原始字段,而不是BoundFields.看起来像动态生成的BoundFields ......这让我感到难过.我可以创建自己的forms.Form子类,其中包含一个fieldsets的概念(即使是一个不向后兼容的粗略的...这只适用于我自己的项目)如果是这样,你能给出任何指针吗?我不想乱用django代码.
我认为这个片段完全符合您的要求.它为您提供了一个Form子类,允许您以声明方式将表单细分为字段集,并在模板中迭代它们.
更新:该片段后来成为django-form-utils的一部分
模型中的场集仍处于"设计"阶段.Django trac 的票价很低.
这是我一直对在不久的将来研究自己感兴趣的东西,但由于我还没有做到,我能提供的最好的是这些片段:
表单拆分/ Fieldset模板标签
分段表格
在分段集中分割的表单
编辑:我刚刚再次注意到这个问题,我意识到需要编辑来指出Carl的项目django-form-utils,它包含一个可以包含fieldsets的BetterForm类.如果你喜欢这个项目给他一个+1他的回答:)
您可以做的一件事是将逻辑字段集分成单独的模型表单类.
class PersonalInfoForm (forms.ModelForm): class Meta: model=MyModel fields=('field1', 'field2', ...) class TermsForm (forms.ModelForm): class Meta: model=MyModel fields=('fieldX', 'fieldY', ...)
将它们传递给不同变量的模板并分解表单集:
从这个意义上说,每个表单类只是实际HTML表单的一个片段.
当您在表单上调用save时,它会带来一丝复杂性.您可能希望传递commit = False,然后合并结果对象.或者完全避免使用ModelForm.save并使用'cleaning_data'手动填充模型对象