动态查询集,其中包含ModelForm中ModelChoiceField的当前日期

时间:2016-03-22 13:01:42

标签: django modelform

我已经阅读了很多类似的问题,但没有人澄清它是在我们第一次运行服务器时,还是每次我们在浏览器中刷新页面时启动的。

我有这样的ModelForm:

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

如果我昨天运行服务器并且今天刷新页面,我仍然拥有昨天的日期时间。

3 个答案:

答案 0 :(得分: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())

答案 1 :(得分:2)

您拥有的代码将在服务器启动时运行一次。如果您希望每次刷新页面都检查日期,则可以传递datetime.today函数而不是值:

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

答案 2 :(得分:0)

Starting with Django 1.9可以在查询级别获取当前时间:

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

Now()将在查询执行时进行评估(而不是在Python代码中执行Now()时)。但请注意,Now()报告数据库服务器已知的时间。