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?

StackOverflow https://stackoverflow.com/questions/134629

  •  02-07-2019
  •  | 
  •  

Pergunta

No meu arquivo urls.py, eu tenho:

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

Onde categories é uma função de visualização dentro myapp/views.py. Nenhum outro views.categories referência linhas URLconf.

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 erro NoReverseMatch:

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 de a documentação reverse , eu não precisa torná-lo um padrão de URL nomeado apenas para uso reverse.

Todas as idéias que eu estou fazendo errado?

Foi útil?

Solução 2

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

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

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

Outras dicas

O exemplo de Jack M. é quase correta.

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

url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),

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.

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 inversa com a string "não-macacos" para obter a URL correta.

Ninja Editar: Aqui está um link para os docs django sobre o assunto.

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