2017-09-04 1 views
-1

Voici mon urls.py:NoReverseMatch à/stocks/5/

urlpatterns=[ 
    url(r'^login/$', views.loginview, name='login'), 
    url(r'logout/$', views.logoutview, name='logout'), 
    url(r'signup/$', views.signup, name='signup'), 
    url(r'^stocks/(?P<pk>[0-9])/$', views.successful_login, name='successful_login'), 
    url(r'^buystocks/(?P<pk>[0-9])/(?P<sn>[A-Z])/buy/$', views.buy, name='buy') 
] 

Voici mon un extrait de modèle:

<form method="post" action="{% url 'buy' pk=user.id sn=stock.stock_name %}" > 

C'est l'erreur que je reçois:

NoReverseMatch at /stocks/5/ 
Reverse for 'buy' with keyword arguments '{u'pk': 5, u'sn': u'HDFC'}' not found. 1 pattern(s) tried: ['buystocks/(?P<pk>[0-9])/(?P<sn>[A-Z])/buy/$'] 
+0

Vos 'pk's sont-ils dans la plage 0-9? Votre regex actuelle ne supporte pas les nombres au-delà de 9, vous devriez ajouter un '+' après '[0-9]' –

+1

Ouais ils sont dans la gamme 0-9 à partir de maintenant, mais je vais quand même ajouter un '+' .Merci pour le signaler. –

Répondre

3

Il existe un petit problème dans vos expressions régulières, c'est-à-dire qu'elles correspondent simplement à des valeurs à 1 caractère. Un autre regard sur eux

(?P<pk>[0-9])/(?P<sn>[A-Z]) 

sans fioritures:

[0-9]/[A-Z] 

Vous devez ajouter un + après la regex pour résoudre le problème. i.e.:

(?P<pk>[0-9]+)/(?P<sn>[A-Z]+) 

+ signifie que le groupe ou charachter précède doivent apparaître une ou plusieurs fois. par exemple:

A matchs A, A+ matchs A, AA, AAA, ... mais pas une chaîne vide. A* correspond à une chaîne vide en plus de tout ce qui correspond à A+.

Une version plus généralisée de * et + est {m, n} opérateur qui définit une limite supérieure et inférieure pour le nombre de répétitions. Avec cette notation A{2,4} correspond seulement AA, AAA et AAAA. A+ et A* peuvent être réécrits comme A{1,} et A{0,} respectivement. Notez que l'omission de la limite supérieure entraîne l'absence de limite supérieure (en d'autres termes, la limite supérieure est l'infini)