【问题标题】:NoReverseMatch at /stocks/5/NoReverseMatch 在 /stocks/5/
【发布时间】:2018-02-12 23:09:46
【问题描述】:

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 的 sn-p。

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

【问题讨论】:

  • 您的pks 在 0-9 范围内吗?您当前的正则表达式不支持 9 以上的数字,您应该在 [0-9] 之后添加 +
  • 是的,它们目前在 0-9 范围内,但我仍然会添加 +。感谢您指出这一点。

标签: django django-templates django-urls


【解决方案1】:

你的正则表达式有一个小问题,那就是它们只匹配 1 个字符的值。再看看他们:

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

不用大惊小怪:

  [0-9]/[A-Z]

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 2021-03-16
    • 2016-07-20
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多