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?
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?
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.