Django TemplateSyntaxError - PullRequest
       4

Django TemplateSyntaxError

8 голосов
/ 13 июня 2011

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

TemplateSyntaxError в / admin /

Поймал ViewDoesNotExist при рендеринге: Попробовал результаты в модуле polls.views.Ошибка была: у объекта 'module' нет атрибута 'results'

Он выделяет эту строку: {% url 'django-admindocs-docroot' как docsroot%}

Страница администратора работала какочарование, пока я не добрался до третьей части урока и перепутал с 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)

1 Ответ

15 голосов
/ 13 июня 2011
Caught ViewDoesNotExist while rendering: Tried results in module polls.views. 
Error was: 'module' object has no attribute 'results'

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

def results(request):
    # do something

В вашем views.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.

Таким образом, в основном кэш отображений представлений (url или что-либо еще) к функциям создается в виде хэш-карты (словаря).Это строится с помощью этой функции:

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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...