Django Reverso com argumentos '()' e argumentos de palavra-chave '{}' não encontrados


144

Oi, eu tenho um problema irritante.

Eu tenho um padrão de URL como este:

# mproject/myapp.urls.py

url(r'^project/(?P<project_id>\d+)/$','user_profile.views.EditProject',name='edit_project'),

funciona bem no navegador, mas para testes, quando faço isso no shell:

from django.test import Client
from django.core.urlresolvers import reverse

client= Client()
response = client.get(reverse('edit_project'), project_id=4)

Eu tenho o temido:

NoReverseMatch: Reverse for 'edit_project' with arguments '()' and keyword arguments '{}' not found.

O que estou perdendo aqui?


no último django , o reverso é importado dos URLs. iefrom django.urls import reverse
suhailvs

Respostas:



6

A solução @ miki725 está absolutamente correta. Como alternativa, se você desejar usar o argsatributo, em vez de kwargs, basta modificar seu código da seguinte maneira:

project_id = 4
reverse('edit_project', args=(project_id,))

Um exemplo disso pode ser encontrado na documentação . Isso essencialmente faz a mesma coisa, mas os atributos são passados ​​como argumentos. Lembre-se de que qualquer argumento passado precisa receber um valor antes de ser revertido. Basta usar o espaço para nome correto, que neste caso é 'edit_project'.


1
Eu gosto da sua brevidade.
Bartleby 15/03

2

Esses problemas me causaram muita dor de cabeça quando tentei usar o reverse para gerar um link de ativação e enviá-lo por e-mail, é claro. Então, eu acho que a partir do tests.py será o mesmo. A maneira correta de fazer isso é a seguinte:

from django.test import Client
from django.core.urlresolvers import reverse

#app name - name of the app where the url is defined
client= Client()
response = client.get(reverse('app_name:edit_project', project_id=4)) 

1
Eu apenas tentei isso, não funciona. A resposta de @ miki725 está correta.
precisa saber é o seguinte

1
Eu acredito que um parênteses está no lugar errado: response = client.get (reverse ('edit_project', project_id = 4)) #
302 Wim Feijen

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.