Comment utiliser django.core.urlresolvers.reverse avec une référence de fonction au lieu d'un modèle d'URL nommé?

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

  •  02-07-2019
  •  | 
  •  

Question

Dans mon fichier urls.py , j'ai:

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

catégories est une fonction de vue dans myapp / views.py . Aucune autre ligne URLconf ne fait référence à views.categories .

Dans un fichier de test unitaire, j’essaie de saisir cette URL à l’aide de django.core.urlresolvers.reverse () , au lieu de copier simplement '/ categories /' (DRY et tous cette). Donc, j'ai:

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

url = reverse(views.categories)

Lorsque j'exécute mes tests, le code d'erreur NoReverseMatch est généré:

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

Cela correspond parfaitement si je fais du motif d'URL un motif nommé, comme ceci:

url(r'^categories/

Et utilisez le nom du motif pour le faire correspondre:

url = reverse('myapp-categories')

Mais pour autant que je sache, l'inverse du documentation , je ne devrais pas en faire un modèle d’URL nommé uniquement pour utiliser reverse .

Avez-vous des idées sur ce que je fais mal?

, views.categories)

catégories est une fonction de vue dans myapp / views.py . Aucune autre ligne URLconf ne fait référence à views.categories .

Dans un fichier de test unitaire, j’essaie de saisir cette URL à l’aide de django.core.urlresolvers.reverse () , au lieu de copier simplement '/ categories /' (DRY et tous cette). Donc, j'ai:

<*>

Lorsque j'exécute mes tests, le code d'erreur NoReverseMatch est généré:

<*>

Cela correspond parfaitement si je fais du motif d'URL un motif nommé, comme ceci:

<*>

Et utilisez le nom du motif pour le faire correspondre:

<*>

Mais pour autant que je sache, l'inverse du documentation , je ne devrais pas en faire un modèle d’URL nommé uniquement pour utiliser reverse .

Avez-vous des idées sur ce que je fais mal?

, views.categories, 'myapp-categories')

Et utilisez le nom du motif pour le faire correspondre:

<*>

Mais pour autant que je sache, l'inverse du documentation , je ne devrais pas en faire un modèle d’URL nommé uniquement pour utiliser reverse .

Avez-vous des idées sur ce que je fais mal?

, views.categories)

catégories est une fonction de vue dans myapp / views.py . Aucune autre ligne URLconf ne fait référence à views.categories .

Dans un fichier de test unitaire, j’essaie de saisir cette URL à l’aide de django.core.urlresolvers.reverse () , au lieu de copier simplement '/ categories /' (DRY et tous cette). Donc, j'ai:

<*>

Lorsque j'exécute mes tests, le code d'erreur NoReverseMatch est généré:

<*>

Cela correspond parfaitement si je fais du motif d'URL un motif nommé, comme ceci:

<*>

Et utilisez le nom du motif pour le faire correspondre:

<*>

Mais pour autant que je sache, l'inverse du documentation , je ne devrais pas en faire un modèle d’URL nommé uniquement pour utiliser reverse .

Avez-vous des idées sur ce que je fais mal?

Était-ce utile?

La solution 2

Après une enquête plus poussée, il s’est avéré qu’il s’agissait d’un problème quant à la façon dont j’importais le module de vues:

Comment passer avec succès une référence de fonction à la fonction reverse () de Django?

Merci les gars pour l’aide: vous m’avez inspiré de le regarder correctement.

Autres conseils

L'exemple de Jack M. est presque correct.

Il doit s'agir d'une fonction d'URL, pas d'un tuple, si vous souhaitez utiliser des URL nommées.

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

Cela fonctionne, et tout le code que vous avez collé est correct et fonctionne bien (je l'ai simplement copié dans une application de test / projet vierge et l'inversion de l'URL a été effectuée sans problème). Donc, il se passe quelque chose d'autre que vous ne nous avez pas montré. Simplifiez les notions de base jusqu'à ce que cela fonctionne, puis commencez à ajouter de la complexité et à voir où ça se brise.

De même, vous pouvez faire " ./ manage.py shell " puis importez de manière interactive la fonction inverse et votre fonction d'affichage et essayez l'inverse. Cela supprimera la configuration du test comme cause possible.

La fonction inverse utilise en réalité le " nom " de l'URL. Ceci est défini comme suit:

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

Vous appelez maintenant reverse avec la chaîne "no-monkeys". pour obtenir l'URL correcte.

Ninja Edit: Voici un lien vers les django sur le sujet.

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

Vous appelez maintenant reverse avec la chaîne "no-monkeys". pour obtenir l'URL correcte.

Ninja Edit: Voici un lien vers les django sur le sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top