Django modelformset 的 order_by 不起作用

1 投票
2 回答
1534 浏览
提问于 2025-04-17 18:06

我想在Django(1.4)中使用一个modelformset,当这个表单集合加载时,表单会根据我模型中的exam_date字段进行排序。为此,我创建了一个简单的BaseModelFormSet。

class BaseExamDateFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(BaseExamDateFormSet, self).__init__(*args, **kwargs)
        self.queryset = models.ExamDate.objects.all().order_by('exam_date')

正如你所看到的,我按照Django文档的建议,修改了查询集(稍后我还会修改它的clean方法,但现在不重要)。之后,我在我的视图中使用它来创建表单集合:

ExamDateFormSet = modelformset_factory(
    models.ExamDate, 
    exclude =('authority', ), 
    can_delete=True, 
    extra=1,
    formset = forms.BaseExamDateFormSet
)
...
formset = ExamDateFormSet()

我的问题是,当表单集合被渲染时,表单中的数据总是以相同的顺序显示(可能是按id排序),而不管order_by属性的值是什么 :(

我应该尝试在我的ExamDate模型中设置一个默认的排序方式吗?不过我其实不太喜欢这个解决方案 :(

谢谢大家!

2 个回答

1

更简单的是,在你上面的代码中,你可以去掉 modelformset_factory 调用中的 formset= 参数,然后像下面这样创建你的表单集:

formset = ExamDateFormSet(queryset=models.ExamDate.objects.order_by('exam_date'))
3

经过一番搜索,我找到了解决办法!

我没有使用queryset这个属性,而是给BaseExamDateFormSet添加了以下方法:

def get_queryset(self):
    return models.ExamDate.objects.all().order_by('exam_date')

不过我还不太明白为什么queryset这个属性不起作用。

撰写回答