【问题标题】:Django tutorial. 404 on Generic ViewsDjango 教程。 404 通用视图
【发布时间】:2011-11-22 06:48:59
【问题描述】:

更新:使用 Dreamhost 提供的 Django 1.2.1 和 Python 2.5.2。

我在 Django 教程的最后一部分遇到问题,其中 urls.py 被更改为使用通用视图。更改代码后,页面上出现 404,甚至索引也停止工作。

我已经检查了所有模板以查看是否是问题所在,但我删除了任何 poll 实例并将其替换为 object。我还附上了 index/object_list 的模板。

我在 Dreamhost 上运行它,我使用视图设置的静态 url 运行良好。

urls.py

from brsplash.models import Poll
from django.conf.urls.defaults import *
from django.contrib import admin
from django.views.generic import *
admin.autodiscover()

info_dict = {
    'queryset': Poll.objects.all(),
}
urlpatterns = patterns('',
    (r'^$', 'django.views.generic.list_detail.object_list', info_dict),
    (r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail',     info_dict),
    url(r'^(?P<object_id>\d+)/results/$', 'django.views.generic.list_detail.object_detail', dict(info_dict,     template_name='brsplash/results.html'), 'poll_results'),
    (r'^(?P<poll_id>\d+)/vote/$', 'brsplash.views.vote'),
)    

urlpatterns += patterns('',
(r'^admin/', include(admin.site.urls)),

poll_list.html

    {% if object_list %}
    <ul>
    {% for object in object_list %}
        <li><a href="{{ object.id }}/">{{ object.question }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available</p>
{% endif %}

【问题讨论】:

  • 为什么不使用基于类的通用视图? Django 1.3 中的旧式通用视图只是为了与针对早期版本的 Django 构建的代码兼容。当然,这是假设您实际上使用的是 Django 1.3,如果您正在阅读教程,我不确定您为什么不会这样做。
  • 抱歉,Dreamhost 只有 Django 1.2.1 和 Python 2.5.2,否则我会使用较新的 1.3 方式。
  • 在结果/url(r'^(?P&lt;object_id&gt;\d+)/results/ $', 之后注意正则表达式中的空间,我怀疑你的意思是有那个空间并且会'prolly 生成 404
  • 您可以在 Dreamhost 上升级到 Django 1.3:blog.oscarcp.com/?p=167
  • @jturnbull:很好的发现。 melkore:如果你对这件事有任何选择,你应该使用 Django 1.3。针对旧代码库开始新项目绝不是一个好主意。无论如何,您迟早都需要升级,这只会让这一切变得更加困难。如果您刚刚开始学习 Django,那就更是如此。根据 1.2.1 工作,您获得的任何新知识都会立即过时。

标签: django django-templates django-views


【解决方案1】:

您可以在 Dreamhost 上升级到 Django 1.3:blog.oscarcp.com/?p=167 – jturnbull 9 月 22 日 9:54

这解决了我遇到的 urls.py 问题。一旦我升级到 1.3.1 并更改代码以反映它,我的页面又回来了。

【讨论】:

    【解决方案2】:

    Django 1.3 引入了基于类的通用视图,它将取代这种基于函数的方法(请参阅documentation page 顶部的注释),因此最好使用它们。

    使用基于类的方法,您的新详细信息页面 url 将如下所示:

    from brsplash.models import Poll
    ...
    from django.views.generic import ListView
    
    urlpatterns = {'',
        url(r'^$', ListView.as_view(model=Poll)),
        ...
    }
    

    这种方法可以在part 4 of the tutorial找到。

    注意:我倾向于不将 template_name 参数传递给 as_view,因为如文档中所述:

    ListView 通用视图使用名为 /_list.html 的默认模板

    【讨论】:

    • 所以我投了反对票,因为您在我发布答案后将问题编辑为“仅 1.2”? ://
    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2012-08-31
    • 2014-09-29
    • 2012-11-13
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多