作为参数但不在视图中使用

时间:2015-01-24 23:45:16

标签: django django-urls

嗨我有这样的网址模式:

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

但我不知道是否可以?

2 个答案:

答案 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/

虽然如果你想支持这种情况,这取决于你。