我已经阅读了很多类似的问题,但没有人澄清它是在我们第一次运行服务器时,还是每次我们在浏览器中刷新页面时启动的。
我有这样的ModelForm:
class TestForm(ModelForm):
field1 = ModelChoiceField(queryset=Model.objects.filter(datetime=datetime.today()))
如果我昨天运行服务器并且今天刷新页面,我仍然拥有昨天的日期时间。
答案 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()
报告数据库服务器已知的时间。