modelformset __iter__ 重载问题

4 投票
1 回答
1044 浏览
提问于 2025-04-17 02:08

我正在写一个自定义的表单集合(modelformset)。我希望这些表单能够按照“ordering”字段的值进行排序。为此,我在我的子类表单集合中重写了 __iter__ 方法。

我的类是从 BaseFormSet 继承的:

class SortedCatForms(BaseFormSet):
    def __iter__(self):
        return iter(self.forms.sort(
                            key=lambda form: form['ordering'].value())) #line 38, the problem line.

    def __getitem__(self, index):
        return list(self)[index]

我在我的 modelformset 中使用它:

OrderCatsFormSet = modelformset_factory(ParentCategory,
                                    fields=('category', 'ordering'),
                                    formset=SortedCatForms,
                                    extra=0)

问题是:

在渲染时捕获到 TypeError:'NoneType' 对象不可迭代

异常位置:...forms.py 的 __iter__ 方法,第 38 行

但是在源代码的 BaseFormSet 中:

def __iter__(self):
    """Yields the forms in the order they should be rendered"""
    return iter(self.forms)

我的代码哪里出错了?应该怎么做才对?

编辑:

完整的错误追踪信息

编辑:

在 @bobince 的建议后,我的代码变成了这样:

class SortedCatForms(BaseFormSet):
def __iter__(self):
    return iter(
            sorted(self.forms, key=lambda form: form['ordering'].value()))

def __getitem__(self, index):
    return list(self)[index]

它返回了一个没有表单的空列表。问题出在 __getitem__ 吗?

1 个回答

7

对Django不太熟悉,无法判断这是不是正确的方法,但这里有一个简单的注意事项:

return iter(self.forms.sort( ...

sort() 是一个列表的方法,它会直接对列表进行排序,并且返回 None。你可能想要的是:

return iter(sorted(self.forms, ...

撰写回答