Pergunta

Meu urlconf contém esse padrão:

url(r'^accounts/logout/$','django.contrib.auth.views.logout', name="logout"),

E eu estou tentando reverter isso em um modelo com a tag URL como esta:

<a href="{% url logout next_page=request.path %}">logout</a>

Mas continuo recebendo o seguinte erro:

Reverse for 'logout' with arguments '()' and keyword arguments '{'next_page': u'/first-page/child/'}' not found

Eu pensei django.contrib.auth.views.logout deve tomar uma opção next_page parâmetro. Tenho certeza de que estou perdendo algo óbvio, mas não tenho certeza do que é.

Foi útil?

Solução

Sim, você está certo, django.contrib.auth.views.logout aceita um parâmetro "next_page" opcional, mas não se esqueça que a tag "URL" corresponde aos padrões de urlconf, não visualizações, então não está ciente do que é ou não é um parâmetro de uma visão. Portanto, isso sugere que você precisa fazer "Next_Page" um grupo nomeado no regexp para o padrão acima, o que você pode fazer, mas há uma maneira mais fácil de lidar com redirecionamentos ...

Olhando para django.Contrib.Auth.Views.Logout, você pode ver que, na ausência de um parâmetro "Next_Page", a visualização é redirecionada para qualquer URL fornecido em solicitação. Padrões para a string "Next". Então, deixando seu urlconf do jeito que está, você pode fazer algo assim em seu modelo:

<a href='{% url logout %}?next={{ request.path }}'>logout</a>

Outras dicas

Basicamente, o Dispatcher de URL de Django está olhando para o Urlconf e esse argumento e dizendo "Não sei onde colocar esse argumento" porque não olha para a exibição funciona que os URLs apontam, apenas o urlconf e os padrões nele.

No momento, não há lugar no seu padrão de URL para esse argumento.

ou seja, você pode ligar para Django.Contrib.Auth.Views.Logout com os argumentos extras se você escrever seu próprio padrão para ele ou se você chamá -lo de sua própria visualização, mas não do seu padrão de URL padrão.

Um desses padrões de URL pode funcionar para você (não testado):

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"),

Espero que ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top