代码之家  ›  专栏  ›  技术社区  ›  Matthew Schinckel

在inlineformset中筛选项

  •  1
  • Matthew Schinckel  · 技术社区  · 15 年前

    我目前正在使用inlineformset_factory为一个人获取带有假日的表单集,但我只想显示将来的假日对象。

    HolidaysFormset = inlineformset_factory(Person, Holiday)
    

    在个人类中,很容易获得未来的假期:

    def future_holidays(self):
        return self.holidays.filter(end__gte=datetime.date.today())
    

    我已经查看了相关的源代码,formField_回调看起来有点前途,但是它只在每个字段的基础上调用,并且不能(我认为)限制哪些对象匹配。

    有什么建议吗?我最好是创建自己的表单集,还是创建假期的子类?还是应该考虑使用自定义管理器?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Matthew Schinckel    15 年前

    一种解决方案是提供一个新的formset基类, .get_queryset() 方法被重写。

    class BaseFutureHolidaysFormSet(BaseInlineFormSet):
        def get_queryset(self):
             return BaseInlineFormSet.get_queryset(self).filter(
                      finish__gte=datetime.date.today()
             )
    

    然后在工厂方法中使用:

    HolidaysFormSet = inlineformset_factory(Person, Holiday,
         formset=BaseFutureHolidaysFormSet)
    

    这是预期的工作。

    (哦,谢谢 The Nested Float ,因为这里讨论了这类解决方案。)

        2
  •  0
  •   h-kippo    14 年前

    这个解决方案对我不起作用-我只收到奇怪的错误消息。

    我在Django1.1中的解决方案(在我的应用程序中,而不是在管理应用程序中)是返回到基本模型表单集,它支持限制查询集: http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#changing-the-queryset .

    例如:

    MyFormSet = modelformset_factory(MyModel)
    

    myformset = MyFormSet(queryset=MyModel.objects.exclude(..criteria here..).filter(document=object_id))
    

    我还尝试了多种方法来超越baseinlineformset类,但都没有奏效。

    虽然这是可行的,但在我的项目中,简化模型可能是更好的解决方案。