web-dev-qa-db-fra.com

Django: Inverse pour 'detail' avec les arguments '(' ',)' et les arguments de mot clé '{}' non trouvés

Je suis le tutoriel officiel pour apprendre Django et j'utilise 1.5.

J'ai eu ce lien dans le cadre de mon modèle d'index, qui fonctionnait bien:

<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>

cependant, cela est codé en dur et le tutoriel a suggéré une meilleure façon d’utiliser:

<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>

de sorte que vous serez mieux à l'aise avec le grand nombre de modèles et que vous devez modifier l'URL.

Depuis que j'ai apporté les modifications ci-dessus, les erreurs suivantes apparaissent lorsque j'exécute l'application:

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

Mon urls.py ressemble à ceci:

from Django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
    url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
   url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),                     
)

views.py ressemble à ceci:

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})

mon template index.html ressemble à ceci:

{% if latest_poll_list %}
    <ul>
    {% for poll in latest_poll_list %}
        <li><a href="{% url 'polls:detail' poll_id %}">{{ poll.question }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p> No polls are available.</p>
{% endif %}

Habituellement, je pourrais facilement lire d'où vient l'erreur et y remédier, mais dans ce cas, je ne peux pas en identifier la cause et je ne peux donc pas progresser dans mon étude ... Toute aide sera grandement appréciée.

12

Dans votre index.html, vous avez donné poll_id comme argument, mais ce n'est que le nom que l'argument aura dans la fonction detail; il n'est pas défini dans votre modèle. La valeur réelle avec laquelle vous voulez appeler la fonction est probablement poll.id.

19
Thijs van Dien

Mon erreur était une faute de frappe sur detail.html:

<form action={% url 'polls:vote' polls.id %}" method="post">

aurait du être

<form action={% url 'polls:vote' poll.id %}" method="post">

Il m'a fallu un certain temps pour comprendre que la page Django traceback me dirigeait constamment vers la ligne de code correspondante. : $

7
dmvianna

Cela m'est arrivé quand je lisais un tutoriel. Je n'ai pas changé poll_id en pk:

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

contre

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

J'ai eu du mal avec ça pendant un moment. Puis j'ai remarqué que j'avais mis poll.id et non Poll.id avec un (majuscule)

0
samgichuru

L'erreur a été résolue pour moi après avoir corrigé la condition de filtre dans views.py.

extrait de mon point de vue.py

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

extrait de mon models.py

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

La 1ère valeur est stockée dans la base de données et la seconde valeur est destinée à être affichée aux utilisateurs.

données brutes de ma base de données 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 |
+---------------------------------------+-----------+

Quand j’avais utilisé " published ", j’obtenais cette erreur. Une fois que j'ai changé le filtre en " Publié ", tout a été réglé.

0
Sharath K P

aussi dans 

sondages/urls.py

j'ai eu une faute d'orthographe

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

vs le bon code

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

passé quelque temps à chercher l'erreur, alors cherchez l'orthographe correcte. lol

0
VeganxEdge