modelformset __iter__重载问题

时间:2011-09-12 20:30:00

标签: python django django-forms

我正在编写自定义的modelformset。我需要按字段“排序”的值对表单进行排序。我在我的子formset类中重载了BaseFormSet的__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'对象不可迭代

     

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

但是在源BaseFormSet中:

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

我的代码有什么问题?如何以正确的方式做到这一点?

编辑:

full traceback

编辑:

在@ 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 个答案:

答案 0 :(得分:6)

不熟悉Django判断这是否是正确的方式,但这里有一个简单的问题:

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

sort()是列表上的一种方法,可以就地对其进行排序并返回None。你可能意味着:

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