Django URL模式

2024-06-07 11:02:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

特定的后视图示例
这两个站点呈现相同的内容,并希望第二个站点呈现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")),

谢谢哈克贝利·芬恩和克拉克斯的帮助!


Tags: name标记comview视图url站点html
3条回答

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

首先,更改为:

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'),

您的postURLconf正则表达式

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以斜杠结尾

无论如何,试着在postListView之后定义您DetailViewURLconf。在我看来,如果您将列表视图和详细视图更改为posts/post/,您的问题将得到解决。对于tagsURLconf问题的解决方案是相同的。

你的正则表达式

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

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

应该改成

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

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

相关问题 更多 >

    热门问题