django modelform和其他字段及其顺序

时间:2012-12-03 15:11:08

标签: django django-forms modelform

我有一个模型形式,并为其表单创建了其他字段(在模型中不存在)。

我知道您可以像the docs中所说的那样重新排序模型中的字段。

但问题是 - 我希望在其他字段之前渲染其他字段。

是否有可能在渲染之前以某种方式重新排序表单的字段?表单对象如何跟踪其字段的顺序?

艾伦

3 个答案:

答案 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属性。如果给定此属性,则应该是要包含在表单中的字段名称列表。当表单呈现时,将遵循在该列表中指定字段名称的顺序。