嗨我有这样的网址模式:
url(r'^post/(?P<post_id>\d+)/(?P<post_slug>[\w|\W]+)/$', views.detail, name="detail"),
但我不认为在我的视野中使用post_slug。当有人像这样输入网址时没有问题:
127.0.0.1:8000/post/5/my-first-post/
当有人像这样输入网址时也没有问题:
127.0.0.1:8000/post/5/mydflgkdfgld/
我该如何处理?我想要id(用于查询)和slug(用于美丽的URL) 感谢您的评论。我的观点是这样的:
def detail(request, post_id, post_slug):
post = get_object_or_404(Post, is_pub=True, pk=post_id)
return render(request, 'blog/index.html', {'post': post})
但我想仅使用 post_id 进行查询。但在我的新视图中,我使用了 post_slug :
def detail(request, post_id, post_slug):
post = get_object_or_404(Post, is_pub=True, pk=post_id)
if post.slug == post_slug:
return render(request, 'blog/index.html', {'post': post})
else:
return HttpResponseRedirect(reverse('blog:detail', args=[post_id, post.slug]))
但我不知道是否可以?
答案 0 :(得分:1)
您可以使用非捕获组:
url(r'^post/(?P<post_id>\d+)/(?:[\w|\W]+)/$', views.detail, name="detail"),
答案 1 :(得分:0)
在detail
视图中,您可以添加传入的slug
参数,也可以只捕获**kwargs
作为最后一个参数。
def detail(request, id, slug=''):
# slug might be passed in, but you don't need to worry about it
pass
您不能省略slug
参数,因为Django 会将其传递给视图,即使您实际上并不需要它。这是因为您为其设置了捕获组(模式中为(?P<slug>)
)。
您可以省略捕获组以防止传递参数。
url(r'^post/(?P<post_id>\d+)/[\w|\W]+/$', views.detail, name="detail"),
哪个应该阻止它传递给您的视图。这是因为你并没有告诉Django捕获它(没有括号),更进一步,你没有给它起一个名字(?P<name>
部分)。
另一个选项是use multiple url patterns,以捕捉不同的可能性(包括可选的slug)。这看起来并不像你要求的那样,但它会处理slug实际上没有传递到视图中的情况。
http://localhost:8000/post/5/
虽然如果你想支持这种情况,这取决于你。