Django ModelForm中ModelChoiceField的当前日期动态查询集

Django ModelForm中ModelChoiceField的当前日期动态查询集,django,modelform,Django,Modelform,我读过很多类似的问题,但没有人澄清它是在我们第一次运行服务器时启动的,还是每次在浏览器中刷新页面时启动的 我有这样一个模型: class TestForm(ModelForm): field1 = ModelChoiceField(queryset=Model.objects.filter(datetime=datetime.today())) 如果我昨天运行了服务器,今天刷新了页面,我仍然有昨天日期时间的对象。您的代码将在服务器启动时运行一次。如果希望在每次页面刷新时检查日期,可以传

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

我有这样一个模型:

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

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

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

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

问题在于,当服务器第一次加载时,查询集会被评估一次

解决方案是在表单的
\uuuu init\uuuu
方法中设置查询集,以便每次实例化表单时都对查询集进行求值

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())
可以在查询级别获取当前时间:

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

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

在Django 1.7中不推荐将可调用项传递给queryset参数的支持,在1.9()中删除了该支持。这看起来不错。但是最后一行可能是:self.fields['field1'].queryset=Model.objects.filter(datetime=datetime.today())?