我有一个模型表单,我为它的表单创建了额外的字段(模型中不存在)。
我知道您可以像文档中所说的那样重新排序模型表单中的字段。
但问题是 - 我希望在其他字段之前呈现附加字段。
是否可以在渲染之前以某种方式重新排序表单的字段?表单对象如何跟踪其字段的顺序?
艾伦
我有一个模型表单,我为它的表单创建了额外的字段(模型中不存在)。
我知道您可以像文档中所说的那样重新排序模型表单中的字段。
但问题是 - 我希望在其他字段之前呈现附加字段。
是否可以在渲染之前以某种方式重新排序表单的字段?表单对象如何跟踪其字段的顺序?
艾伦
不管。看来我已经找到了答案,这似乎可以解决问题,因为我添加了 2 个附加字段:
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.build_fields()
l = len(self.fields.keyOrder)
for i in range(0,2):
f = self.fields.keyOrder[l-1]
self.fields.keyOrder.pop(l-1)
self.fields.keyOrder.insert(0, f)
以上是我最初的修复。后来我发现它不再切割了。然后我这样做了:
class AlertForm(forms.ModelForm):
class Meta:
model = Message
fields = model_fields
def __init__(self, *args, **kwargs):
super(AlertForm, self).__init__(*args, **kwargs)
self.build_fields()
newKeyOrder = []
newKeyOrder.append('field_that_had_to_be_first')
if typechange:
newKeyOrder.append('field_thats_sometimes_necessary')
newKeyOrder += model_fields
self.fields.keyOrder = newKeyOrder
上面的解决方案不再适用于 django 2(我不知道从什么时候开始)......
但是现在,ModelForm 上有一个有序的 dict fields 属性,我们可以使用它来重新排序字段......
class MyForm(forms.ModelForm):
class Meta:
fields = ['model_field1', 'model_field2']
model = MyModel
extra_field = forms.CharField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for k in self._meta.fields:
self.fields.move_to_end(k)
ModelForm 的 Meta 类的 fields 属性定义了要显示的字段和顺序。
使用 ModelForm 的内部 Meta 类的 fields 属性。此属性(如果给定)应该是要包含在表单中的字段名称列表。当表单呈现它们时,会遵循在该列表中指定字段名称的顺序。