2009-07-20 13 views
1

私は現在、inlineformset_factoryを使用してPersonの休日を含むフォームセットを取得していますが、将来のHolidayオブジェクトのみを表示したいだけです。 Personクラスの中でInlineFormsetの項目をフィルタリングする

HolidaysFormset = inlineformset_factory(Person, Holiday) 

、将来の休暇を取得することは簡単です:

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

私は、関連するソースコードを見てきた、とformfield_callbackはやや有望に見えたが、それだけで呼ばれていますフィールドごとに、どのオブジェクトが一致するかを制限するために使用することはできません。

提案がありますか?私は自分自身のFormSet、またはHolidayのサブクラスを作成するのが最善でしょうか?または、カスタムマネージャを使用して調べる必要がありますか?

答えて

0

解決策の1つは、.get_queryset()メソッドがオーバーライドされた新しいFormSet Baseクラスを提供することです。

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にああ、ありがとう、この種の解決策がそこに議論されるよう)

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クラス以上の複数の方法を試してみましたが、どれも働きました。

私のプロジェクトでは、これは機能しますが、モデルを単純化する方が良い解決策かもしれません。

+0

どのような種類のエラー? –

関連する問題