Como faço para usar django.core.urlresolvers.reverse com uma referência de função em vez de um padrão de URL nomeado?

votos
8

Na minha urls.pyarquivo, eu tenho:

from myapp import views
...
(r'^categories/$', views.categories)

Onde categoriesé uma função de visualização dentro myapp/views.py. Não há outras linhas URLconf referência views.categories.

Em um arquivo de teste de unidade, eu estou tentando agarrar esta URL usando django.core.urlresolvers.reverse(), em vez de apenas copiar '/ Categorias /' (DRY e tudo o que). Então eu tenho:

from django.core.urlresolvers import reverse
from myapp import views
...

url = reverse(views.categories)

Quando eu corro meus testes, eu recebo um NoReverseMatcherro:

NoReverseMatch: Reverse for '<function categories at 0x1082f30>' with arguments '()' and keyword arguments '{}' not found.

Ele corresponde muito bem se eu fizer o padrão de URL um padrão chamado, como este:

url(r'^categories/$', views.categories, 'myapp-categories')

E usar o nome padrão para combiná-lo:

url = reverse('myapp-categories')

Mas, tanto quanto eu posso dizer a partir da reversedocumentação , eu não deveria precisar de torná-lo um padrão de URL nomeado apenas para usar reverse.

Alguma idéia do que estou fazendo de errado?

Publicado 25/09/2008 em 18:15
fonte usuário
Em outras línguas...                            


4 respostas

votos
2

Após investigação futher, Acontece que era um problema com a forma como eu estava importando o módulo visualizações:

Como faço para passar com êxito uma referência de função para função de Django reverse ()?

Obrigado pela ajuda, porém, rapazes: você me inspirou a olhar para ele corretamente.

Respondeu 28/09/2008 em 20:56
fonte usuário

votos
2

O exemplo de Jack M. é quase correta.

Ele precisa ser uma função url, não uma tupla, se você quiser usar urls nomeados.

url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
Respondeu 25/09/2008 em 23:55
fonte usuário

votos
0

Isto funciona, e todo o código que você colou é correto e funciona bem (Eu apenas copiei-lo em um teste de aplicativo limpo / projeto e ele reverteu a URL sem qualquer problema). Portanto, há algo mais acontecendo aqui que você não nos mostrou. Simplificar para baixo aos princípios nu-ossos até que ele funciona, em seguida, começar a adicionar complexidade de volta e ver onde ele está quebrando.

Além disso, você pode fazer "shell ./manage.py" e, em seguida, de forma interativa importar a função inversa e sua função de visualização e tentar o inverso. Isso vai remover a configuração de teste como uma possível causa.

Respondeu 25/09/2008 em 21:39
fonte usuário

votos
-1

A função inversa, na verdade, usa o "nome" da URL. Isto é definido assim:

urlpatterns = patterns('',
    (r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
    (r'^admin/(.*)', admin.site.root),
)

Agora você chamaria reverter com a string "não-macacos" para obter a URL correta.

Editar Ninja: Aqui está um link para a documentação do Django no assunto.

Respondeu 25/09/2008 em 18:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more