我在我的网站中使用 Django 表单并希望控制字段的顺序。
这是我定义表单的方式:
class edit_form(forms.Form):
summary = forms.CharField()
description = forms.CharField(widget=forms.TextArea)
class create_form(edit_form):
name = forms.CharField()
名称是不可变的,仅应在创建实体时列出。我使用继承来添加一致性和 DRY 原则。发生的事情并没有错,事实上完全可以预料的是,名称字段在 View /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())
这让我闭嘴:)
最佳答案
来自 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']
关于python - Django表单,表单字段的继承和顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/913589/