我有一个模型形式,并为其表单创建了其他字段(在模型中不存在)。
我知道您可以像the docs中所说的那样重新排序模型中的字段。
但问题是 - 我希望在其他字段之前渲染其他字段。
是否有可能在渲染之前以某种方式重新排序表单的字段?表单对象如何跟踪其字段的顺序?
艾伦
答案 0 :(得分:1)
不管。似乎我已经找到了答案,这似乎可以解决问题,因为我已经添加了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
答案 1 :(得分:0)
以上解决方案不再适用于django 2(我不知道何时开始)...
但是现在,在ModelForm上有一个有序的dict字段属性,我们可以用来对字段重新排序...
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)
答案 2 :(得分:-1)
ModelForm`s Meta class的字段属性定义要显示的字段和顺序。
使用ModelForm内部Meta类的fields属性。如果给定此属性,则应该是要包含在表单中的字段名称列表。当表单呈现时,将遵循在该列表中指定字段名称的顺序。