美好的一天SO!
我正在对URL的显示方式进行一些改动。目前,url reverse采用对象的PK。我想保持这种方式,只是表明 URL中的一个对象的可读性。 具体说,我想在我的网址中添加一个虚拟slu ..
为此,我在我的URL正则表达式中使用了非捕获括号:
url(r'^(?P<pk>\d+)(?:/(?P<slug>[\w\d-]+))/$', views.Detail.as_view(), name='detail'),
现在我可以访问
本地主机:8000 /博客/ 12 /标题-的-MY-博客/
或
本地主机:8000 /博客/ 12 /
两者都会毫无错误地显示博客,但现在麻烦就开始了。 如果我按下发布按钮,它将不会按预期发布:
url(r'^(?P<pk>[0-9]+)/publish/$', views.Publish.as_view(), name='publish'),
class Publish(PermissionRequiredMixin, View):
""" Publish the current blog """
permission_required = 'blogs.publish_blog'
def get(self, request, *args, **kwargs):
print('get')
pk = self.kwargs.get('pk', None)
blogs.services.blog.publish(pk)
return HttpResponseRedirect('/blogs/' + pk)
(这也适用于其他按钮,如编辑/分享/等)
现在,如果我拿走非捕获括号组((?:/(?P [\ w \ d - ] +))?/ $)它会再次正常工作。
我一直在阅读非捕获括号,网址翻转 可能性和限制,但我无法找出它为什么会搞砸了 系统没有任何错误。
如果您了解出了什么问题,请告诉我一个解释 为什么它出错了,让我朝着正确的方向努力解决 这个问题?
提前多多感谢!
答案 0 :(得分:0)
您可能在urls.py中的发布之前列出了您的详细网址。这意味着/ blogs / 18 / publish将被发布URL捕获,因为“publish”是slug字段的有效值。因此,详细信息视图将始终提供该URL。
您可以交换网址的顺序来解决此问题。
请注意,“发布”操作,因为它修改了数据,应该是POST,而不是GET。