【问题标题】:Django: getting error NoReverseMatch for reverseDjango:反向出现错误 NoReverseMatch
【发布时间】:2013-12-05 03:56:57
【问题描述】:

出现错误:

NoReverseMatch:“single_view”与参数“('article', 2013, 12, 12, 'triumphmotorcycleslaunched10newbikesinindia', 16)' 和关键字参数“{}”的反向。尝试了 1 种模式:[u'(P[article|review|blog|news|video])/(P\d{4})/(P\d{2})/(P\d{2} )/(P\w+)/(P\d+)$']

这是我的 URLConf、模型和视图

/urls.py

...
url(r'^(P<post_type>[article|review|blog|news|video])/', include('post.urls', namespace='post_views')),
...

/post/urls.py

urlpatterns = patterns('',
  url(r'^$', PostView.as_view(), name="index"),
  url(r'^(P<year>\d{4})/(P<month>\d{2})/(P<day>\d{2})/(P<slug>\w+)/(P<post_id>\d+)$', PostView.single, name="single_view")
)

and get_absolute_url in models.Post class

/post/models.py

def get_absolute_url(self):
    from django.core.urlresolvers import reverse
    return reverse('post_views:single_view', args=['article', 2013, 12, 12, str(self.slug).replace('-', ''), self.id])

并查看

/post/views.py

def single(self, request, post_type, year, month, day, slug, post_id, *args, **kwargs):
    post_single = Post.objects.get(pk=1)

    context = {
        "post_single": post_single,
    }
    return self.render_to_response(context);

解析器错误:在@Yeo 建议后尝试

from django.core.urlresolvers import reverse, resolve
from post.models import Post
p = Post.objects.get(pk=16)
reverse('post_views:single_view', args=['article', 2013, 12, 12, p.slug, p.id])
resolve('/article/2013/12/12/triumphlaunched10newbikesinindia/16/')

Resolver404: {u'path': u'article/2013/12/12/triumphlaunched10newbikesinindia/16/', u'tried': [[], [ (None:vehicle) ^vehicle/>], [ ( None:post_views) ^(P[article|review|blog|news|video])/>], [ (None:gallery) ^gallery/>], [ (None:author) ^author/>], [.* )$>], [ (None:None) ^admin/doc/>], [ (admin:admin) ^admin/>], [ (None:None) ^admin_tools/>]]}

【问题讨论】:

  • 尝试从args 中删除'article'
  • 为了更好地调试 NoReverseMatch,请改为运行 reverse 命令,并使用 resolver Resolver Docs 提供完整的 url 来查看正确的格式应该如何,当然在你的 django 中运行它壳。你很快就能回答你自己的问题了 :) 祝你好运
  • @Rohan 仍然无法工作...
  • @Yeo 我试过resolve,但这也引发了错误。我试过了:resolve('article/2013/12/12/triumphlaunched10newbikesinindia/16')
  • 尝试使用前导 / 斜线 resolve('/article/2013/12/12/triumphlaunched10newbikesinindia/16/')

标签: python django


【解决方案1】:

您的正则表达式格式错误,请尝试替换

r'(P<post_type>[article|review|blog|news|video])'

r'(?P<post_type>article|review|blog|news|video)'

注意问题符号和方括号的缺失。

类似,替换

r'^(P<year>\d{4})/(P<month>\d{2})/(P<day>\d{2})/(P<slug>\w+)/(P<post_id>\d+)$

r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<slug>\w+)/(?P<post_id>\d+)$

【讨论】:

  • @VINAYKr.SHARMA 很高兴它有帮助。如果您找到满足您需求的答案,您可以accept it
  • 你节省了我很多时间。从昨天开始,我一直在挣扎。 ?P 之前是什么意思?
  • @VINAYKr.SHARMA 有关详细信息,请参见 docs.python.org/2/howto/regex.html(查找 ?P)。简单的P 是一个普通字符,而?P 是一个控制令牌。您的原始正则表达式查找字符串 'P&lt;post_type&gt;' 后跟其中一个符号的完全匹配(由于括号括起来 [...]a,r,t,i...
  • 糟糕,我认为它使参数可选!
猜你喜欢
  • 2014-01-20
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多