在执行Django教程时会注意到这个问题。
转到mysite.com/polls
并且调查不存在:
“没有民意调查。”
我可以apachectl restart
或touch mysite/wsgi.py
获得相同的结果,然后新行会在mysite.com/polls
正确显示
为什么在没有重新启动服务器的情况下,在管理站点上创建新行后,新行会立即显示在mysite.com/polls
?
来自urls.py的相关代码:
from django.conf.urls import patterns, url
from django.views.generic import DetailView, ListView
from django.utils import timezone
from polls.models import Poll
urlpatterns = patterns('',
url(r'^$',
ListView.as_view(
queryset=Poll.objects.filter(pub_date__lte=timezone.now) \
.order_by('-pub_date')[:5],
context_object_name='latest_poll_list',
template_name='polls/index.html'),
name='index'),
...
views.py。中没有mysite.com/polls
的代码。
mysite.com/polls
{% if latest_poll_list %}
<ul>
{% for poll in latest_poll_list %}
<li>
<a href="{% url 'polls:detail' poll.id %}">{{ poll.question }}</a>
</li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
使用:
额外说明:
SELECT
- 能够在管理站点创建后从postgresql shell中获取django.test.client.Client
django.test.client.Client
从shell进行新的投票时,无法从shell客户端或mysite.com/polls
读取新的投票,但可以从psql
和{mysite.com/admin
读取服务器重启前的{1}}。答案 0 :(得分:0)
Django中的查询集通常被“懒惰地”评估,这意味着您可以编写类似Poll.objects.filter(pub_date__lte=timezone.now).order_by('-pub_date')
的内容,然后每次评估它(尝试实际从中获取数据)时,它将获取数据就在那一刻。
然而,在末尾添加[:5]
会对其进行评估。这意味着你传递给ListView的实际上并不是一个查询集,只是一个值列表;创建视图时创建的列表,然后永远不会重新评估。
为了实现您的目标,我建议您在ListView
中创建一个覆盖views.py
方法的自定义queryset
。有关如何完成此操作的详细信息,只需查看the docs。