I’m following a Django tutorial and suddenly when I try to access http://127.0.0.1:8000/admin/ it gives me a TemplateSyntaxError.
TemplateSyntaxError at /admin/
Caught ViewDoesNotExist while rendering: Tried results in module polls.views. Error was: ‘module’ object has no attribute ‘results’
It highlights this line:
{% url ‘django-admindocs-docroot’ as docsroot %}
The admin page worked like a charm until I got to part 3 of the tutorial and messed with the urls, although I did it exactly like they said so I doubt it’s the problem.
urls.py:
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^polls/$', 'polls.views.index'),
(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
(r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
(r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
(r'^admin/', include(admin.site.urls)),
)
admin.py:
from polls.models import Poll
from polls.models import Choice
from django.contrib import admin
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 0
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']
search_fields = ['question']
date_hierarchy = 'pub_date'
admin.site.register(Poll, PollAdmin)
views.py:
from django.http import HttpResponse
from polls.models import Poll
from django.template import Context, loader
def index(request):
latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
t = loader.get_template('polls/index.html')
c = Context({
'latest_poll_list': latest_poll_list,
})
return HttpResponse(t.render(c))
def detail(request, poll_id):
return HttpResponse("You're looking at poll %s. " % poll_id)
def vote(request, poll_id):
return HttpResponse("You're voting on poll %s." % poll_id)
That’s pretty much all you need. Ignore the
TemplateSyntaxError, it’s not related to the template at all. Django is telling you that you don’t have this:In your views.py. You’ll get
ViewDoesNotExisterrors outside the admin when you start writing urls and referencing functions that don’t actually exist in them, so make sure as you progress that you either ensure you have such stub functions that just return a basic 200, or you comment out those urls until you need them.Technically speaking this is an extension of a python error. If you ran:
You’d get an
AttributeError.Since you asked why, if you look in
Django/core/urlresolvers.pyyou’ll see the line:So basically a cache of view mappings (urls or whatever) to functions is made in the form of a hashmap (dictionary). This is constructed by this function:
Which evaluates each callback to check it exists (newlines are mine).