我在我的网站中使用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内部数据结构之一),它不提供任何对key:value对进行重新排序的方法。但是,它确实提供了一种在给定索引处插入项目的方法,但是会将项目从类成员移动到构造函数中。该方法可以工作,但是会使代码的可读性降低。我认为合适的另一种方法是修改框架本身,这在大多数情况下都不是最优的。
简而言之,代码将变成这样:
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())
那让我闭嘴:)