【发布时间】:2010-10-29 03:41:52
【问题描述】:
我在我的网站中使用 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())
这让我闭嘴:)
【问题讨论】:
-
多年以后我相信你已经知道了,但是python中的类名应该总是“CamelCased”。只有方法名称是“named_with_underscore”。
-
您的意思是“camelCased”吗? :)
-
TitleCase 是正确的术语,我相信。
标签: python django django-forms