当前位置:  开发笔记 > 后端 > 正文

ModelForm上的Django和fieldsets

如何解决《ModelForm上的Django和fieldsets》经验,为你挑选了3个好方法。

我知道您可以在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代码.



1> Carl Meyer..:

我认为这个片段完全符合您的要求.它为您提供了一个Form子类,允许您以声明方式将表单细分为字段集,并在模板中迭代它们.

更新:该片段后来成为django-form-utils的一部分



2> Van Gale..:

模型中的场集仍处于"设计"阶段.Django trac 的票价很低.

这是我一直对在不久的将来研究自己感兴趣的东西,但由于我还没有做到,我能提供的最好的是这些片段:

表单拆分/ Fieldset模板标签

分段表格

在分段集中分割的表单

编辑:我刚刚再次注意到这个问题,我意识到需要编辑来指出Carl的项目django-form-utils,它包含一个可以包含fieldsets的BetterForm类.如果你喜欢这个项目给他一个+1他的回答:)



3> Joe Holloway..:

您可以做的一件事是将逻辑字段集分成单独的模型表单类.

class PersonalInfoForm (forms.ModelForm):
    class Meta:
        model=MyModel
        fields=('field1', 'field2', ...)

class TermsForm (forms.ModelForm):
    class Meta:
        model=MyModel
        fields=('fieldX', 'fieldY', ...)

将它们传递给不同变量的模板并分解表单集:

Personal Information {{ personal_info_form }}
Terms and Conditions {{ terms_form }}

从这个意义上说,每个表单类只是实际HTML表单的一个片段.

当您在表单上调用save时,它会带来一丝复杂性.您可能希望传递commit = False,然后合并结果对象.或者完全避免使用ModelForm.save并使用'cleaning_data'手动填充模型对象


@Greg,downvote并没有打扰我,但你的评论令人困惑.太多的努力是什么意思?将单片形式分解为可以彼此独立操作的单独形式片段是解决此问题的惯用方法.自从我提供这个答案以来,Django可能在两年内添加了更多"fieldset"实用程序,但这种方法仍然有效.
推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有