2011-06-12 3 views
8

Я следую учебнику Django, и вдруг, когда я пытаюсь получить доступ к http://127.0.0.1:8000/admin/, он дает мне TemplateSyntaxError.Django TemplateSyntaxError

TemplateSyntaxError в/админ/

Пойманный ViewDoesNotExist при визуализации: Пробовал результаты в модуле polls.views. Ошибка была: «модуль» объект имеет атрибута «Результаты»

Он выделяет эту строку: {% URL «Джанго-admindocs-DOCROOT», как docsroot%}

страница админ работал как шарм, пока я попал в часть 3 учебника и испортил URL-адреса, хотя я сделал это точно так, как они сказали, поэтому я сомневаюсь, что это проблема.

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) 
+2

опубликовать файл poll/views.py. Кажется, там, где ошибка –

+0

Я добавил def результаты to views.py, и это сработало, но почему? Не может django просто игнорировать его? Некоторые вещи в джанго иногда просто не имеют смысла. – Lockhead

+0

um, это имеет смысл. Когда кто-то посещает URL/polls/1234/results /, функция «results» вызывается из вашего view.py, и аргумент id передается ему. Затем эта функция отображает ваш шаблон и возвращает его пользователю. Так работает Django –

ответ

15
Caught ViewDoesNotExist while rendering: Tried results in module polls.views. 
Error was: 'module' object has no attribute 'results' 

Это в значительной степени все, что вам нужно. Игнорируйте TemplateSyntaxError, это совсем не связано с шаблоном. Django сообщает вам, что у вас его нет:

def results(request): 
    # do something 

На ваших view.py. Вы получите ошибки ViewDoesNotExist за пределами администратора, когда вы начнете писать URL-адреса и ссылаетесь на функции, которые на самом деле не существуют в них, поэтому убедитесь, что по мере того, как вы прогрессируете, вы либо гарантируете, что у вас есть такие функции-заглушки, которые возвращают базовый 200, или вы прокомментируйте эти URL-адреса, пока они вам не понадобятся.

Технически это расширение ошибки python. Если вы запускали:

$ python manage.py shell 
>>> from poll import views 
x = views.results 

Вы бы получить AttributeError.

Так как вы спросили, почему, если вы смотрите в Django/core/urlresolvers.py вы увидите строку:

_callable_cache = {} # Maps view and url pattern names to their view functions. 

Так в основном кэш зрения отображений (URLs или любые другие) для функций выполнены в виде HashMap (Словарь). Это строится по этой функции:

def _get_callback(self): 
    if self._callback is not None: 
     return self._callback 
    try: 
     self._callback = get_callable(self._callback_str) 
    except ImportError, e: 
     mod_name, _ = get_mod_func(self._callback_str) 
     raise ViewDoesNotExist("Could not import %s. Error was: %s" % (
                  mod_name, str(e))) 
    except AttributeError, e: 
     mod_name, func_name = get_mod_func(self._callback_str) 
     raise ViewDoesNotExist("Tried %s in module %s. Error was: %s" % (
                func_name, mod_name, str(e))) 
    return self._callback 
callback = property(_get_callback) 

Что оценивает каждый обратный вызов, чтобы проверить его существование (новые строки являются моими).

+0

Спасибо! Теперь я понимаю, почему это не просто игнорируется. – Lockhead

Смежные вопросы