Django: Invertido para ‘detalle’ con argumentos ‘(‘ ‘,)’ y argumentos de palabra clave ‘{}’ no encontrados

Sigo el tutorial oficial para aprender Django y uso 1.5.

Tenía este enlace como parte de mi plantilla de índice, que funcionaba bien:

  • {{ poll.question }}
  • sin embargo, esto está codificado y el tutorial sugirió que una mejor manera era usar:

     
  • {{ poll.question }}
  • de modo que sea mejor cuando trabaje con una gran cantidad de plantillas y tendrá que realizar cambios en la URL.

    Desde que hice el cambio anterior, recibo los siguientes errores cuando ejecuto la aplicación:

     Exception Type: NoReverseMatch Exception Value: Reverse for 'detail' with arguments '('',)' and keyword arguments '{}' not found. 

    Mi urls.py se ve así:

     from django.conf.urls import patterns, url from polls import views urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^(?P\d+)/$', views.detail, name='detail'), url(r'^(?P\d+)/results/$', views.results, name='results'), url(r'^(?P\d+)/vote/$', views.vote, name='vote'), ) 

    views.py se ve así:

     from django.shortcuts import render, get_object_or_404 from django.http import Http404 from polls.models import Poll def index(request): latest_poll_list = Poll.objects.order_by('-pub_date')[:5] context = {'latest_poll_list': latest_poll_list} return render(request, 'polls/index.html', context) def detail(request, poll_id): poll = get_object_or_404(Poll, pk = poll_id) return render(request, 'polls/detail.html', {'poll': poll}) 

    Mi plantilla index.html se ve así:

     {% if latest_poll_list %}  {% else %} 

    No polls are available.

    {% endif %}

    Por lo general, podría leer fácilmente de dónde viene el error y resolverlo, pero en este caso no puedo identificar la causa del error, por lo que no puedo avanzar con mi estudio. Cualquier ayuda será apreciada.

    En su index.html le dio a poll_id como un argumento, pero ese es el nombre que tendrá el argumento dentro de la función de detail ; no está definido en su plantilla. El valor real con el que desea llamar a la función es probablemente poll.id

    Mi error fue un error tipográfico en detail.html :

     

    debería haber sido

     

    Me tomó un tiempo darme cuenta de que la página de rastreo de django me estaba apuntando a la línea de código relevante todo el tiempo. PS

    Esto me pasó cuando estaba leyendo el tutorial. No cambié poll_id a pk:

     url(r'^(?P\d+)/$', views.DetailView.as_view(), name='detail'), 

    vs

     url(r'^(?P\d+)/$', views.DetailView.as_view(), name='detail'), 

    Luché con esto por un tiempo. Entonces me di cuenta de que había puesto poll.id y no Poll.id con una (mayúscula P)

    También en

    encuestas / urls.py

    Tuve un error de ortografía

    url (r ‘^ (? P [0-9] +) / $’, views.detail, name = ‘detail s ‘),

    vs el código correcto

    url (r ‘^ (? P [0-9] +) / $’, views.detail, name = ‘detail’),

    Pasé algún tiempo buscando el error, así que busque la ortografía adecuada. jajaja

    El error se solucionó para mí después de corregir la condición del filtro en views.py.

    fragmento de mis vistas.py

     def post_share(request, post_id): post = get_object_or_404(Post, id=post_id, status='Published') 

    fragmento de mi models.py

     class Post(models.Model): STATUS_CHOICES=( ('draft','Draft'), ('published','Published'), ) 

    El primer valor se almacena en la base de datos y el segundo valor se muestra a los usuarios.

    datos en bruto de mi base de datos mysql

     +---------------------------------------+-----------+ | title | status | +---------------------------------------+-----------+ | Revolution 2020 | published | | harry potter and the sorcerer's stone | published | | harry potter and the cursed child | draft | | five point someone | published | | half girlfriend | draft | | one night at the call center | published | | Django by example | published | +---------------------------------------+-----------+ 

    Cuando había utilizado ” publicado “, estaba recibiendo dicho error. Una vez que cambié el filtro a ” Publicado “, todo se solucionó.