2011-06-12 14 views
8

estoy siguiendo un tutorial de Django y de repente cuando intento acceder a la http://127.0.0.1:8000/admin/ Me da una TemplateSyntaxError.Django TemplateSyntaxError

TemplateSyntaxError en/admin/

Atrapados ViewDoesNotExist mientras que la prestación: resultados juzgado en polls.views módulo. Error fue: 'módulo' objeto tiene 'resultados' ningún atributo

Se destaca esta línea: {% url 'Django admindocs-docroot' como docsroot%}

La página de administración funcionó de maravilla hasta que Llegué a la parte 3 del tutorial y me metí con las URL, aunque lo hice exactamente como dijeron, así que dudo que sea el problema.

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

publique su archivo poll/views.py. Parece que es donde está el error –

+0

Agregué los resultados de def a views.py y funcionó, pero ¿por qué? ¿No puede django simplemente ignorarlo? Algunas cosas en django a veces simplemente no tienen sentido. – Lockhead

+0

um, tiene perfecto sentido. Cuando alguien visita la URL/encuestas/1234/resultados/se llama a la función "resultados" desde su views.py y se le pasa la ID del argumento. Esa función luego renderiza su plantilla y la devuelve al usuario. Así es como funciona Django –

Respuesta

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

eso es prácticamente todo lo que necesita. Ignore el TemplateSyntaxError, no está relacionado con la plantilla en absoluto. Django le dice que no tiene esto:

def results(request): 
    # do something 

en su views.py. Usted obtendrá ViewDoesNotExist errores fuera del administrador cuando se empieza a escribir las direcciones URL y hacer referencia a funciones que en realidad no existen en ellos, así que asegúrese medida que avanza que o bien asegurarse de que tiene las funciones de código auxiliar que simplemente devuelven un básico de 200, o comenta esas URL hasta que las necesites.

Técnicamente hablando, esto es una extensión de un error de pitón. Si ejecutó:

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

Te obtener una AttributeError.

Ya que preguntó por qué, si nos fijamos en Django/core/urlresolvers.py verá la línea:

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

Así que, básicamente, una caché de vista de asignaciones de direcciones URL (o lo que sea) a las funciones se realiza en la forma de un mapa hash (diccionario). Esto se construye mediante esta función:

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) 

que evalúa cada una devolución de llamada para comprobar que existe (saltos de línea son mías).

+0

Gracias! Ahora veo por qué no solo se ignora. – Lockhead

Cuestiones relacionadas