2016-03-22 8 views
2

私は多くの同様の質問を読んでいますが、初めてサーバーを実行したとき、またはブラウザでページを更新するたびに起動されるかどうかはわかりません。ModelForm内のModelChoiceFieldの現在の日付を持つ動的クエリーセット

私はこのようなのModelFormあります

class TestForm(ModelForm): 
    field1 = ModelChoiceField(queryset=Model.objects.filter(datetime=datetime.today())) 

をそして、私は昨日、サーバーを走ったと私は今日ページを更新した場合、私はまだ昨日の日時にオブジェクトを持っています。

答えて

3

問題は、あなたのクエリセットが一度だけ評価されていることをするときにサーバーが最初にロードされます。

解決策は、フォームの__init__メソッドでクエリセットを設定し、フォームがインスタンス化されるたびにクエリーセットが評価されるようにすることです。

class TestForm(ModelForm): 
    # Use the empty qs .none() here, we override it in __init__ anyway 
    field1 = ModelChoiceField(queryset=Model.objects.none()) 

    def __init__(self, *args, **kwargs): 
     super(TestForm, self).__init__(*args, **kwargs) 
     self.fields['field1'].queryset = Model.objects.filter(datetime=datetime.today()) 
+0

これは良いですね。しかし、最後の行は次のようになります:self.fields ['field1']。queryset = Model.objects.filter(datetime = datetime.today())? – toscanelli

+0

@toscanelli良い点、今修正されました。 – Alasdair

2

コードは、サーバーの起動時に一度実行されます。日付はすべてのページにチェックされていることをしたい場合は、代わりに価値のdatetime.today関数を渡すことができ、リフレッシュ:

class TestForm(ModelForm): 
    field1 = ModelChoiceField(queryset=Model.objects.filter(datetime=datetime.today)) 
+2

Django 1.7ではcallerをqueryset引数に渡す機能が廃止され、1.9では削除されました([リリースノート](https://docs.djangoproject.com/ja/1.9/internals/deprecation/#deprecation-removed-in) -1-9))。 – Alasdair

0

Starting with Django 1.9は、クエリ・レベルで現在の時刻を得ることが可能である:(Now()は、Pythonコードで実行されたときではなく)

from django.db.models.functions import Now 
Model.objects.filter(datetime=Now()) 

Now()は、クエリ実行時に評価されるであろう。ただし、Now()は、データベースサーバーに知られている時間を報告することに注意してください。

関連する問題