1

私は非常に単純なブログを作成しましたが、いくつかのURLの問題に遭遇しています。タグと特定の投稿ビューについて、次の問題が発生します。

特定の投稿ビューの例
これら2つのサイトは同じレンダリングを行い、2番目のサイトは404をレンダリングします。website.com / post / 1 / hello
-world website.com/post/1/hello-world/non-sense(should
レンダリング404)

タグビュー
website.com/tag/python:これにより、pythonとタグ付けされたすべての投稿が表示されます。ただし...
website.com/tag/python/party:これにより、404をレンダリングする代わりに、「python/party」とタグ付けされたすべての投稿がレンダリングされます。

これが私の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投稿後にあなたを定義してみてくださいListView。私の意見では、リストビューと詳細ビューをに変更するposts/post/、問題は解決します。解決策は問題についても同じですtags URLconf

于 2013-03-26T18:39:34.650 に答える
0

あなたの正規表現

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

グループタグには、「tag/」の後のすべての文字が含まれることを意味します。[\ w | \ W]は、「すべての英数字」または「英数字以外のすべて」を意味します。これは「すべての文字」に相当します。

次のように変更する必要があります

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

これにより、最初は英数字以外のグループが停止します

于 2013-03-26T18:47:53.997 に答える
0

確かに、今私は2つの方法を見ています。

まず、次のように変更します。

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

(ところで、あなたの場合は[]は必要ありません)このようにして、タグコントローラーのパラメーターとして「end」というグループを取得し、それをテストして404カスタムページにリダイレクトするか、404クラシックエラーを生成できます。

2番目の可能性は次のとおりです。別のURLフックとコントローラーを追加します。

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

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

このようにして、「tag/」の後に英数字以外の文字を含むURLを禁止します。

最後にオプションの「/」を1つだけ許可する場合は、新しいフックの代わりに次のように記述できます。

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