Django - 在未请求的视图上获取ViewDoesNotExist

0 投票
1 回答
1161 浏览
提问于 2025-04-17 11:08

我刚刚完成了Django教程的第四部分,但在检查服务器时遇到了这个问题:

出现了ViewDoesNotExist的错误,意思是说在渲染时找不到视图:尝试在模块polls.views中找到results,但错误提示是:这个模块没有'results'这个属性。

还有常见的错误信息:

/usr/lib/pymodules/python2.7/django/core/urlresolvers.py中的_get_callback,行170

教程的最后一部分是要从views.py中去掉除了'vote'以外的所有请求,我以为我做对了,但显然不是。

从我能看到的代码中,并没有请求'results'这个视图,我仔细检查了好几遍代码,还是找不到问题。

urls.py:

from django.conf.urls.defaults import patterns, include, url

from django.contrib import admin
admin.autodiscover()

url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

url(r'^admin/', include(admin.site.urls)),

from django.conf.urls.defaults import *
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'),
)

views.py:

from django.http import HttpResponseRedirect, HttpResponse
from polls.models import Choice, Poll
from django.shortcuts import render_to_response, get_object_or_404
from django.http import Http404
from django.template import RequestContext
from django.core.urlresolvers import reverse

def vote(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    try:
        selected_choice = p.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the poll voting form.
        return render_to_response('polls/detail.html', {
            'poll': p,
            'error_message': "You didn't select a choice.",
        }, context_instance=RequestContext(request))
    else:
        selected_choice.votes += 1
        selected_choice.save()

        return HttpResponseRedirect(reverse('poll_results', args=(p.id,)))

models.py:

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __unicode__(self): 
        return (self.question)

class Choice (models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()
    def __unicode__(self):
        return (self.choice)

admin.py:

from polls.models import Poll
from polls.models import Choice
from django.contrib import admin

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
    list_display = ('question', 'pub_date')
    list_filter = ['pub_date']
    date_hierarchy = 'pub_date'
    search_fields = ['question']


admin.site.register(Poll, PollAdmin)

希望能得到一些帮助来找到问题所在。:)

1 个回答

0

你网址配置的最后一行提到了 polls.views.vote。这会导致Django尝试导入 polls.views,如果这个文件里有任何错误(根据你收到的错误信息来看,确实有),那么导入就会失败。

去看看 polls/views.py 文件,找找看“results”是在哪里被导入的。虽然你发的views.py代码里没有这样的内容,但那是完整的文件吗,还是只是其中的一部分?

撰写回答