0

在做 Django 教程时会注意到这个问题。

  1. 在管理站点上成功进行投票,然后在管理站点上显示该选项:

在管理站点上成功创建投票

  1. 转到mysite.com/polls并且投票不存在:“没有可用的投票。”

  2. 我可以要么 要么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 %}

使用:

  1. 姜戈 1.5
  2. 蟒蛇 3.3.0-3
  3. mod_wsgi 3.4-2
  4. PostgreSQL 9.2.3-1
  5. 阿帕奇 2.2.24-1
  6. linux 3.8.4-1

额外说明:

  1. Django (1.5) 开发服务器上的相同行为
  2. 当我在 python 2.7 和 MySQL 下做 Django (1.5) 教程时,以前没有出现相同的行为
  3. 在管理站点创建后,这些行可以SELECT从 postgresql shell
  4. 当在管理站点上使用django.test.client.Client
  5. 当我使用 shell 从 shell 进行django.test.client.Client新轮询时,新轮询无法从 shell 客户端或 onmysite.com/polls读取,但是在服务器重新启动之前psql和之前都可以读取。mysite.com/admin
4

1 回答 1

0

Django 中的查询集通常是“懒惰地”评估的,这意味着您可以编写类似Poll.objects.filter(pub_date__lte=timezone.now).order_by('-pub_date')一次的内容,然后每次评估它(尝试从中实际获取数据)时,它都会立即去获取数据。

但是,将其添加[:5]到最后会立即评估它。这意味着您传递给 ListView 的内容实际上并不是一个查询集,而只是一个值列表;一个列表,在创建视图时创建一次,然后永远不会重新评估。

为了实现您的目标,我建议您创建一个覆盖该方法的自定义ListView。有关如何执行此操作的更多信息,只需查看文档views.pyqueryset

于 2013-03-27T19:27:30.233 回答