如果我有一份Django表格,比如:
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField()
sender = forms.EmailField()
我调用此表单实例的as_table()方法,Django将按照上面指定的顺序呈现字段。
我的问题是Django如何知道类变量在哪里定义的顺序?
(另外,我如何重写这个顺序,例如当我想从类的init方法中添加一个字段时?)
Tags:
[注意:这个答案现在已经完全过时了-请参阅下面的讨论和更新的答案]。
如果
f
是一个表单,那么它的字段是f.fields
,这是一个django.utils.datastructures.SortedDict
(它按添加的顺序显示项)。After form construction f.fields有一个keyOrder属性,该属性是一个包含字段名的列表,其显示顺序与字段名的显示顺序一致。您可以将其设置为正确的顺序(尽管您需要谨慎操作以确保不会遗漏项目或添加附加项)。下面是我在当前项目中创建的一个示例:
我继续回答自己的问题。以下是供日后参考的答案:
在Django中,
form.py
使用__new__
方法执行一些黑暗魔法,以类中定义的顺序将类变量最终加载到self.fields
。self.fields
是一个DjangoSortedDict
实例(在datastructures.py
中定义)。所以要重写这个,假设在我的示例中,您希望sender优先,但需要将其添加到init~/strong>方法中,您可以:
Django 1.9的新特性是Form.field_order和Form.order_fields()。
相关问题 更多 >
编程相关推荐