我目前正在使用inlineformset_factory来获取带有Holidays for Person的formset,但我只想显示将来的Holiday对象。
HolidaysFormset = inlineformset_factory(Person, Holiday)
在Person类中,很容易获得未来的假期:
def future_holidays(self):
return self.holidays.filter(end__gte=datetime.date.today())
我查看了相关的源代码,并且formfield_callback看起来略显有希望,但这只是基于每个字段调用,并且不能用于(我认为)来限制哪些对象匹配。
有什么建议吗?我最好创建自己的FormSet,还是Holiday的子类?或者我应该考虑使用自定义管理器吗?
答案 0 :(得分:0)
一种解决方案是提供一个新的FormSet Base类,并覆盖.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,因为这里讨论了这种解决方案。)
答案 1 :(得分:0)
此解决方案对我不起作用 - 我只收到奇怪的错误消息。
我在Django 1.1中的解决方案(在我的应用程序中,而不是在管理员应用程序中)是回到基本模型FormSet,它支持限制查询集: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类,但没有一种方法可行。
虽然这有效,但在我的项目中,简化模型可能是一个更好的解决方案。