/stocks/5/ 处的 NoReverseMatch

NoReverseMatch at /stocks/5/

Django 的反向功能显然无法解析我的 URL。

这是我的 urls.py 包含网址

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')
]

包含重定向到 URL 的代码段如下。

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

追溯如下

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/$']

您的正则表达式中存在一个小问题,即它们仅匹配 1 个字符的值。再看看它们:

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

不用大惊小怪:

  [0-9]/[A-Z]

您需要在正则表达式后添加一个 + 来解决问题。即:

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

+表示前面的组或字符必须出现一次或多次。例如:

A 匹配 AA+ 匹配 AAAAAA,...但不是空字符串。 A* 除了 A+ 匹配的所有内容之外还匹配一个空字符串。

*+ 的更通用版本是 {m, n} 运算符,它设置重复次数的上限和下限。使用该符号 A{2,4} 仅匹配 AAAAAAAAAA+A*可以分别重写为A{1,}A{0,}。请注意,省略上限会导致没有上限(换句话说,上限为无穷大)