Django 教程:通用视图。属性错误
Posted
技术标签:
【中文标题】Django 教程:通用视图。属性错误【英文标题】:Django Tutorial: Generic Views. Attribute Error 【发布时间】:2012-08-31 12:11:03 【问题描述】:我在 this 教程的最后一部分。
from django.conf.urls import patterns, include, url
from django.views.generic import DetailView, ListView
from polls.models import Poll
urlpatterns = patterns('',
url(r'^$',
ListView.as_view(
queryset=Poll.objects.order_by('-pub_date')[:5],
context_object_name='latest_poll_list',
template_name='polls/index.html')),
url(r'^(?P<pk>\d+)/$',
DetailView.as_view(
model=Poll,
template_name='polls/detail.html')),
url(r'^(?P<pk>\d+)/results/$',
DetailView.as_view(
model=Poll,
template_name='polls/results.html'),
name='poll_results'),
url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
)
ListView 可以工作,但是当我使用 DetailView 访问 url 时,我得到了。
AttributeError at /polls/2/
Generic detail view DetailView must be called with either an object pk or a slug.
Request Method: GET
Request URL: http://127.0.0.1:8000/polls/2/
Django Version: 1.4.1
Exception Type: AttributeError
Exception Value:
Generic detail view DetailView must be called with either an object pk or a slug.
Exception Location: /home/yasith/coding/django/django-tutorial/lib/python2.7/site-packages/django/views/generic/detail.py in get_object, line 46
Python Executable: /home/yasith/coding/django/django-tutorial/bin/python2
Python Version: 2.7.3
我不确定我做错了什么。任何帮助将不胜感激。
编辑:添加主 urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^polls/', include('polls.urls')),
url(r'^admin/', include(admin.site.urls)),
)
【问题讨论】:
看起来没有 pk (id) 为 2 的 Poll 对象。进入 /admin/ 并查看所有 Polls。 @RobOsborne 我收到与127.0.0.1:8000/polls/1 相同的错误有一个 pk=1 的民意调查。 这太奇怪了,Django 1.4.1 中的代码块表明 pk 不是参数之一,但我不明白这是怎么回事。是 urls.py 上面的 urls.py 代码还是教程中的代码?该 urls.py 文件一定有问题。确保您重新启动了测试服务器。 直接来自教程的 urls.py。我也尝试重新启动服务器。结果相同。 您也可以从顶层发布 urls.py 吗?您在本教程中使用什么数据库? 【参考方案1】:我认为您在上面发布的代码不是您磁盘上的代码。
我遇到了同样的问题,但后来我仔细查看了我的代码和教程。我在代码中使用的正则表达式与教程不同。
这是我的代码:
url(r'^(?P<poll_id>\d+)/$',-$
url(r'^(?P<poll_id>\d+)/results/$',-$
这是正确的核心:
url(r'^(?P<pk>\d+)/$',-$
url(r'^(?P<pk>\d+)/results/$',-$
请注意,*poll_id* 在本教程的前面部分中,但通用视图需要 pk。另请注意,教程是正确的,并且您发布了正确的代码(来自教程)。
【讨论】:
谢谢!我专注于视图函数并在那里进行了正确的更改,但没有注意到它们也更改了正则表达式。我想我只是走得太快了。也许他们应该强调(并解释)教程文本中的其他变化......哦,好吧。 这里也一样。这种事情在教程中让我很紧张,并且在与 Django 相关的教程中发生过几次。如果您要我替换一些代码,请显示更改的差异,特别是如果它是隐藏在一行中间的 2 个字符...【参考方案2】:仔细查看他们提到的将 urlpatterns 更改为使用 primarykey 而不是 question_id 的教程。
【讨论】:
是的,距离它告诉您进行更改的地方太远了。以上是关于Django 教程:通用视图。属性错误的主要内容,如果未能解决你的问题,请参考以下文章
Django 教程。通用视图。 context_object_name = 'latest_question_list'
使用通用 PasswordChangeForm Django 视图渲染时捕获 NoReverseMatch