1

我创建了一个非常简单的博客,但遇到了几个 URL 问题。对于我的标签和特定帖子视图,我遇到了以下问题。

具体的帖子视图示例
这两个站点呈现相同的内容,并希望第二个站点呈现 404。
website.com/post/1/hello-world
website.com/post/1/hello-world/non-sense (应该渲染 404)

标记查看
website.com/tag/python:这将呈现所有标记为 python 的帖子,很棒。但是...
website.com/tag/python/party:这将呈现所有标记为“python/party”的帖子,而不是呈现 404。

这是我的 URL 模式设置,因此您可以查看。

url(r'^post/(?P<pk>\d+)/(?P<post_title>)', DetailView.as_view(
                        model = post,
                        template_name = "post.html")),
url(r'^post/$', ListView.as_view(
                        queryset = post.objects.all().order_by("-date"),
                        template_name = "archives.html")),
url(r'^archives/$', ListView.as_view(
                        queryset = post.objects.all().order_by("-date"),
                        template_name = "archives.html")),
url(r'^tag/(?P<tag>[\w|\W]+)', 'tags'),


标签的更新解决方案:

url(r'^tag/(?P<tag>[\w]+)\W*/$', 'tags'),

帖子解决方案:

url(r'^post/(?P<pk>\d+)/(?P<post_url>[\w-]+)/$', DetailView.as_view(
                        model = post,
                        template_name = "post.html")),

感谢 Huckleberry Finn 和 krakax 的所有帮助!

4

3 回答 3

1

的帖子 URLconf正则表达式

url(r'^post/(?P<pk>\d+)/(?P<post_title>)', DetailView.as_view(
                    model = post,
                    template_name = "post.html")),

应该改为

url(r'^post/(?P<pk>\d+)/(?P<post_title>[-\w]+)/$', DetailView.as_view(
                    model = post,
                    template_name = "post.html")),

表示URLconf以斜杠结尾

无论如何,尝试DetailView URLconf在 post 之后定义你ListView。在我看来,如果您将列表视图和详细视图更改为posts/post/您的问题将得到解决。问题的解决方案是相同的tags URLconf

于 2013-03-26T18:39:34.650 回答
0

你的正则表达式

r'^tag/(?P<tag>[\w|\W]+)'

表示组标签将包含“标签/”之后的所有字符。[\w|\W] 表示“所有字母数字”或“除了字母数字之外的所有”。这相当于“所有字符”。

应该改为

r'^tag/(?P<tag>[\w]+)\W*'

这将首先阻止您的组非字母数字

于 2013-03-26T18:47:53.997 回答
0

当然,现在我看到了两种方法。

首先,改为:

r'^tag/(?P<tag>\w+)(?P<end>\W.*)'

(顺便说一句,在您的情况下,[] 不是必需的)这样,您将名为“end”的组作为标签控制器的参数,您可以对其进行测试并重定向到您的 404 自定义页面或生成 404 经典错误。

第二种可能性是:添加另一个 url 钩子和控制器:

url(r'^tag/(?P<tag>\w+)\W*', 'tags404'),

url(r'^tag/(?P<tag>\w+)$', 'tags'),

这样,您就禁止在“tag/”之后包含除字母数字以外的其他字符的任何 url。

如果你想在最后只允许一个可选的'/',你可以写来代替你的新钩子:

url(r'^tag/(?P<tag>\w+)/?$', 'tags'),
于 2013-03-26T19:09:52.457 回答