Come posso usare django.core.urlresolvers.reverse con un riferimento di funzione anziché un pattern URL denominato?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Nel mio file urls.py , ho:

from myapp import views
...
(r'^categories/

Dove categorie è una funzione di visualizzazione in myapp / views.py . Nessun'altra linea URLconf fa riferimento a views.categories .

In un file di unit test, sto provando a catturare questo URL usando django.core.urlresolvers.reverse () , invece di copiare semplicemente '/ categorie /' (DRY e all quello). Quindi, ho:

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

url = reverse(views.categories)

Quando eseguo i test, viene visualizzato l'errore NoReverseMatch :

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

Corrisponde perfettamente se trasformo il pattern URL in un pattern denominato, in questo modo:

url(r'^categories/

E usa il nome del motivo per abbinarlo:

url = reverse('myapp-categories')

Ma per quanto posso dire da il contrario documentazione , non dovrei renderlo un pattern URL denominato solo per usare reverse .

Qualche idea su cosa sto facendo di sbagliato?

, views.categories)

Dove categorie è una funzione di visualizzazione in myapp / views.py . Nessun'altra linea URLconf fa riferimento a views.categories .

In un file di unit test, sto provando a catturare questo URL usando django.core.urlresolvers.reverse () , invece di copiare semplicemente '/ categorie /' (DRY e all quello). Quindi, ho:

<*>

Quando eseguo i test, viene visualizzato l'errore NoReverseMatch :

<*>

Corrisponde perfettamente se trasformo il pattern URL in un pattern denominato, in questo modo:

<*>

E usa il nome del motivo per abbinarlo:

<*>

Ma per quanto posso dire da il contrario documentazione , non dovrei renderlo un pattern URL denominato solo per usare reverse .

Qualche idea su cosa sto facendo di sbagliato?

, views.categories, 'myapp-categories')

E usa il nome del motivo per abbinarlo:

<*>

Ma per quanto posso dire da il contrario documentazione , non dovrei renderlo un pattern URL denominato solo per usare reverse .

Qualche idea su cosa sto facendo di sbagliato?

, views.categories)

Dove categorie è una funzione di visualizzazione in myapp / views.py . Nessun'altra linea URLconf fa riferimento a views.categories .

In un file di unit test, sto provando a catturare questo URL usando django.core.urlresolvers.reverse () , invece di copiare semplicemente '/ categorie /' (DRY e all quello). Quindi, ho:

<*>

Quando eseguo i test, viene visualizzato l'errore NoReverseMatch :

<*>

Corrisponde perfettamente se trasformo il pattern URL in un pattern denominato, in questo modo:

<*>

E usa il nome del motivo per abbinarlo:

<*>

Ma per quanto posso dire da il contrario documentazione , non dovrei renderlo un pattern URL denominato solo per usare reverse .

Qualche idea su cosa sto facendo di sbagliato?

È stato utile?

Soluzione 2

Dopo ulteriori indagini, si è scoperto che era un problema con il modo in cui stavo importando il modulo viste:

Come posso passare correttamente un riferimento di funzione alla funzione reverse () di Django?

Grazie per l'aiuto, ragazzi: mi avete ispirato a guardarlo correttamente.

Altri suggerimenti

L'esempio di Jack M. è quasi corretto.

Deve essere una funzione url, non una tupla, se si desidera utilizzare url con nome.

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

Funziona e tutto il codice che hai incollato è corretto e funziona bene (l'ho appena copiato in un'app di test / progetto pulita e ha invertito l'URL senza alcun problema). Quindi c'è qualcos'altro che non ci hai mostrato. Semplifica fino alle nozioni di base fino a quando non funziona, quindi inizia ad aggiungere nuovamente complessità e vedi dove si sta rompendo.

Inoltre, puoi fare " ./ manage.py shell " quindi importa in modo interattivo la funzione inversa e la funzione di visualizzazione e prova l'inverso. Ciò rimuoverà l'installazione del test come possibile causa.

La funzione inversa utilizza effettivamente il "quot" nome " dell'URL. Questo è definito in questo modo:

urlpatterns = patterns('',
    (r'^no_monkeys/

Ora chiameresti reverse con la stringa " no-monkeys " per ottenere l'URL corretto.

Modifica Ninja: Ecco un link a i documenti di django sull'argomento.

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

Ora chiameresti reverse con la stringa " no-monkeys " per ottenere l'URL corretto.

Modifica Ninja: Ecco un link a i documenti di django sull'argomento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top