【问题标题】:modelformset __iter__ overloading problemmodelformset __iter__ 重载问题
【发布时间】:2011-09-12 20:29:59
【问题描述】:

我正在编写自定义模型表单集。我需要按字段“排序”的值对表单进行排序。我在子表单集类中重载了 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]

我在我的模型表单集中使用它:

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

问题是:

渲染时捕获 TypeError:“NoneType”对象不可迭代

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

但在源 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__有问题吗?

【问题讨论】:

  • 可能需要查看更多的回溯。
  • 我在编辑我的问题时添加了完整的追溯。
  • 一个陷阱已经完成,这很有价值。但是我仍然对此问题有疑问,并且无济于事。我的表单集返回空列表。非常感谢您关注这个问题!

标签: python django django-forms


【解决方案1】:

对Django不够熟悉,无法判断这是否是正确的方式,但这里有一个简单的陷阱:

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

sort() 是列表中的一个方法,它就地排序并返回None。您可能的意思是:

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

【讨论】:

  • 看起来不错,谢谢。现在那里也不例外,但没有呈现任何形式。在文档中告诉:Formsets 也可以被索引到,它返回相应的表单。如果您覆盖__iter__,您还需要覆盖__getitem__ 以具有匹配的行为。这可能是我的问题继续存在的原因吗?如果是,该怎么做?
猜你喜欢
  • 1970-01-01
  • 2018-04-19
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多