1

我有一个模型表单,我为它的表单创建了额外的字段(模型中不存在)。

我知道您可以像文档中所说的那样重新排序模型表单中的字段。

但问题是 - 我希望在其他字段之前呈现附加字段。

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

艾伦

4

3 回答 3

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
于 2012-12-03T15:23:32.527 回答
1

上面的解决方案不再适用于 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)
于 2018-08-14T21:40:06.400 回答
-1

ModelForm 的 Meta 类的 fields 属性定义了要显示的字段和顺序。

使用 ModelForm 的内部 Meta 类的 fields 属性。此属性(如果给定)应该是要包含在表单中的字段名称列表。当表单呈现它们时,会遵循在该列表中指定字段名称的顺序。

于 2012-12-03T15:24:21.143 回答