Django modelformset order_by 不工作

Posted

技术标签:

【中文标题】Django modelformset order_by 不工作【英文标题】:Django modelformset order_by not working 【发布时间】:2013-02-21 01:22:57 【问题描述】:

我想使用一个 Django (1.4) 模型表单集,当加载表单集时,表单将由模型中的exam_date 字段排列。为此,我创建了以下简单的 BaseModelFormSet

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

如您所见,我已按照 django docs(稍后我也会更改它的 clean 方法,但现在没关系)。之后,我在视图中使用它来创建表单集:

ExamDateFormSet = modelformset_factory( 模型.ExamDate, 排除 =('权限', ), can_delete=真, 额外=1, formset = forms.BaseExamDateFormSet ) ... formset = ExamDateFormSet()

我的问题是,当表单集被渲染时,表单中的数据总是以相同的顺序排列(按 id 排列),而不管 order_by 属性的值如何:(

我应该尝试在我的 ExamDate 模型中设置默认顺序吗?不过我真的不喜欢那个解决方案:(

TIA!

【问题讨论】:

【参考方案1】:

更简单的是,在上面的代码中,您可以删除 modelformset_factory 调用中的 formset= 参数并将您的 formset 实例化为:

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

【讨论】:

将查询集作为 kwarg 传递真的有效吗?我现在无法测试它,因为它是一个旧项目:( 它确实有效,为了记录,我使用的是相当旧的 django v1.4.9。可能仍受支持。【参考方案2】:

经过一番搜索,我找到了解决方案!

我忽略了 queryset 属性,并在 BaseExamDateFormSet 中添加了以下方法:

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

但是我还不知道为什么 queryset 属性不起作用。

【讨论】:

以上是关于Django modelformset order_by 不工作的主要内容,如果未能解决你的问题,请参考以下文章

元类与 Django 中的 modelformset_factory 冲突

在基于 Django 类的视图中使用 modelformset_factory

django modelformset 排除 ID 字段

Django 将自定义表单参数传递给 ModelFormset

Django:如何使用 ModelFormSet 和 FormWizard 过滤 ForeignKey 选择(例如使用 request.user)?

带有 ModelForm 和 ModelFormSet 的 Django WizardView(这个不渲染)