我在我的网站上使用Django表单,希望控制字段的顺序.
下面是我如何定义我的表单:
class edit_form(forms.Form):
summary = forms.CharField()
description = forms.CharField(widget=forms.TextArea)
class create_form(edit_form):
name = forms.CharField()
该名称是不可变的,应该仅在创建实体时列出.我使用继承来添加一致性和干燥性原则.实际上完全可以预料到的是,name字段在view/html中最后列出,但我希望name字段位于Summary和description之上.我确实意识到,通过将摘要和描述复制到create_form并松开继承,我可以很容易地修复它,但我想知道这是否可能.
假设您在EDIT_FORM中有Why?个字段,并且必须在CREATE_FORM中的顶部添加10个字段-那么复制和维护这两个表单看起来就不那么诱人了.(这是我的not个案子,我只是编个例子)
那么,我该如何克服这种行为呢?
Edit:个
显然,要做到这一点,就必须经过恶意的黑客攻击(摆弄.field属性).这个field属性是一个SortedDict(Django的内部数据 struct 之一),它不提供任何方式来重新排列键:值对.它确实提供了一种在给定索引处插入项的方法,但这会将项从类成员移动到构造函数中.这种方法可以工作,但会降低代码的可读性.我认为唯一合适的方法是修改框架本身,这在大多数情况下都不是最优的.
简而言之,代码会变成这样:
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())
这让我闭嘴了:)