2013-03-26 72 views
1

我创建了一个非常简单的博客,但已经遇到了几个URL问题。对于我的标记&特定的帖子查看我碰到以下问题。Django网址格式

特定后期查看示例
这两个网站呈现相同的,并希望第二个渲染404
website.com/post/1/hello-world
website.com/post/1/你好世界/无感(应该呈现404)

标签查看
website.com/tag/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")), 

谢谢哈克贝利·费恩和krakax所有帮助!

回答

0

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与最终斜线结束

无论如何,尝试定义你DetailViewURLconf后门柱ListView。在我看来,如果您将列表视图和详细视图更改为posts/post/,则问题将得到解决。解决方案与tagsURLconf问题相同。

+0

嘿哈克,我已经试过这一点,但我得到的404错误'当前的URL,post/1/hello-world /,没有匹配任何这些。' – alxmrph 2013-03-26 18:47:17

+0

@alxmrph更新了答案;} – 2013-03-26 18:53:36

+0

我得到'posts /''post /',但添加了'/ $'如下所示,我收到一个404错误,无法匹配URL。 'url(r'^ post /(?P \ d +)/(?P )/ $',DetailView.as_view( model = post, template_name =“post.html”)),' – alxmrph 2013-03-26 19:01:03

0

你的正则表达式

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

意味着组标签将包含 '标签/' 毕竟caracters。 [\ w | \ W]的意思是'所有字母数字'或'除字母之外的所有字母'。这相当于'全部字符'。

应改为

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

这将在第一个非字母数字

+0

嘿@Krakax这可以很好地阻止它在接收到非字母数字字符时改变标签查询,但是website.com/tag/python/non-sense仍然会呈现website.com/python而不是404。任何想法?感谢您的帮助,我非常感谢! – alxmrph 2013-03-26 18:55:50

+0

找到了标签的解决方案,谢谢!如果您有任何建议,仍然在处理邮政明细视图。 – alxmrph 2013-03-26 19:08:51

+0

如果需要,请阅读我的第二个答案以添加'/'的可选属性。对于POST,执行相同操作,但使用(?P [\ w - ] +)在匹配中添加' - '。 – krakax 2013-03-26 19:19:43

0

当然停止你的团队,现在我明白了2种方式。

首先,更改为:

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

(顺便说一句,[]是不是在你的情况下,必要的)这样,你得到所谓的组“端”为您的标记控制器的参数,你可以测试它并重定向到您的404自定义页面或生成404经典错误。

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

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

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

这样,你就禁止包含其他caracters比字母数字的“标签/”之后的任何URL。

如果你想允许只有一个可选的“/”结尾,你可以放到新勾写:

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

谢谢@krakax!这是我最终以标签进行的解决方案:'url(r'^ tag /(?P [\ w] +)\ W */$','tags'),'' – alxmrph 2013-03-26 19:17:23