2013-03-26 106 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