Errore di tag modello di Django 'url'
Domanda
Il mio URLconf contiene questo schema:
url(r'^accounts/logout/$','django.contrib.auth.views.logout', name="logout"),
E ho cercando di invertire tale in un modello con il tag URL come questo:
<a href="{% url logout next_page=request.path %}">logout</a>
Ma continuo a ricevere il seguente errore:
Reverse for 'logout' with arguments '()' and keyword arguments '{'next_page': u'/first-page/child/'}' not found
Ho pensato django.contrib.auth.views.logout
si suppone di prendere un parametro di un'opzione next_page
. Sono sicuro che mi manca qualcosa di ovvio, ma non sono sicuro di cosa sia.
Soluzione
Si hai ragione, django.contrib.auth.views.logout non accetta un parametro opzionale "next_page", ma non dimenticare che il tag "url" corrisponde a urlconf modelli, non viste, quindi non è a conoscenza di ciò che è o non è un parametro di una vista. Quindi, questo suggerisce che è necessario fare "next_page" un gruppo denominato nella regexp per il modello di cui sopra, che si potrebbe fare, ma c'è un modo più semplice per gestire redirect ...
django.contrib.auth .views.logout , si può vedere che, in assenza di un parametro "next_page", la vista reindirizza a qualunque URL è prevista sia in request.GET o request.POST con il "redirect_field_name" chiave, un parametro che default "REDIRECT_FIELD_NAME" che a sua volta di default alla stringa "Avanti". Quindi, lasciando il vostro urlconf il modo in cui è, si può fare qualcosa di simile nel modello:
<a href='{% url logout %}?next={{ request.path }}'>logout</a>
Altri suggerimenti
In sostanza dispatcher URL di Django sta guardando l'urlconf e tale argomento e dicendo "non so dove mettere questo argomento", perché non guardare le funzioni di vista gli URL puntano, solo l'urlconf e gli schemi in esso.
In questo momento non c'è posto nel vostro modello di URL per tale argomento.
vale a dire. è possibile chiamare django.contrib.auth.views.logout con gli argomenti in più se si scrive il proprio motivo per esso o se si chiama dal vostro punto di vista, ma non dal suo schema di default URL.
Uno di questi modelli di URL potrebbe funzionare per voi (non testato):
url(r'^accounts/logout/(?P<next_page>.*)?$','django.contrib.auth.views.logout', name="logout"),
url(r'^accounts/logout/$','django.contrib.auth.views.logout', kwargs={'next_page':None}, name="logout"),
Speranza che aiuta!