在Django管理员中创建的新行不会在站点上显示

时间:2013-03-27 18:06:45

标签: django apache python-3.x mod-wsgi postgresql-9.2

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

  1. 成功进行投票,然后在管理网站上进行选择,然后显示在管理网站上:
  2. poll successfully created on admin site

    1. 转到mysite.com/polls并且调查不存在: “没有民意调查。”

    2. 我可以apachectl restarttouch mysite/wsgi.py获得相同的结果,然后新行会在mysite.com/polls正确显示

    3. 为什么在没有重新启动服务器的情况下,在管理站点上创建新行后,新行会立即显示在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. Django 1.5
      2. python 3.3.0-3
      3. mod_wsgi 3.4-2
      4. postgresql 9.2.3-1
      5. apache 2.2.24-1
      6. linux 3.8.4-1
      7. 额外说明:

        1. Django(1.5)开发服务器上的相同行为
        2. 当我在python 2.7和MySQL
        3. 下完成Django(1.5)教程时,以前不存在相同的行为
        4. 行是SELECT - 能够在管理站点创建后从postgresql shell中获取
        5. 使用django.test.client.Client
        6. 在管理网站上制作时,可以从shell客户端读取新的民意调查
        7. 当我使用django.test.client.Client从shell进行新的投票时,无法从shell客户端或mysite.com/polls读取新的投票,但可以从psql和{mysite.com/admin读取服务器重启前的{1}}。

1 个答案:

答案 0 :(得分:0)

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

然而,在末尾添加[:5]会对其进行评估。这意味着你传递给ListView的实际上并不是一个查询集,只是一个值列表;创建视图时创建的列表,然后永远不会重新评估。

为了实现您的目标,我建议您在ListView中创建一个覆盖views.py方法的自定义queryset。有关如何完成此操作的详细信息,只需查看the docs