modelformset __iter__ 重载问题
我正在写一个自定义的表单集合(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, ...