Django 表单、表单字段的继承和顺序

新手上路,请多包涵

我在我的网站上使用 Django 表单,并希望控制字段的顺序。

以下是我定义表单的方式:

 class edit_form(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)

class create_form(edit_form):
    name = forms.CharField()

该名称是不可变的,仅应在创建实体时列出。我使用继承来添加一致性和 DRY 原则。发生的事情并没有错误,实际上完全可以预料,名称字段在视图/html 中最后列出,但我希望名称字段位于摘要和描述之上。我确实意识到我可以通过将摘要和描述复制到 create_form 并放弃继承来轻松修复它,但我想知道这是否可能。

为什么? 想象一下,您在 edit_form 中有 100 个字段,并且必须在 create_form 的顶部添加 10 个字段 - 复制和维护这两个表单看起来不会那么性感。 (这 不是 我的情况,我只是举个例子)

那么,我该如何覆盖这种行为呢?

编辑:

显然,如果不经过讨厌的黑客攻击(摆弄 .field 属性),就没有合适的方法来做到这一点。 .field 属性是一个 SortedDict(Django 的内部数据结构之一),它不提供任何重新排序键值对的方法。它确实提供了一种在给定索引处插入项目的方法,但这会将项目从类成员移动到构造函数中。这种方法可行,但会降低代码的可读性。我认为合适的唯一其他方法是修改框架本身,这在大多数情况下都不是最佳选择。

简而言之,代码会变成这样:

 class edit_form(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)

class create_form(edit_form):
    def __init__(self,*args,**kwargs):
        forms.Form.__init__(self,*args,**kwargs)

        self.fields.insert(0,'name',forms.CharField())

那让我闭嘴:)

原文由 hannson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 562
2 个回答

来自 Django 1.9+

Django 1.9 添加了一个新的 Form 属性 field_order ,允许对字段进行排序,而不管它们在类中的声明顺序如何。

 class MyForm(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)
    author = forms.CharField()
    notes = form.CharField()

    field_order = ['author', 'summary']

field_order 中的缺失字段保持其在类中的顺序并附加在列表中指定的字段之后。上面的示例将按以下顺序生成字段: ['author', 'summary', 'description', 'notes']

请参阅文档: https ://docs.djangoproject.com/en/stable/ref/forms/api/#notes-on-field-ordering

直到 Django 1.6

我遇到了同样的问题,我在 Django CookBook 中找到了另一种重新排序字段的技术:

 class EditForm(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)

class CreateForm(EditForm):
    name = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(CreateForm, self).__init__(*args, **kwargs)
        self.fields.keyOrder = ['name', 'summary', 'description']

原文由 Selene 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题