2

django のurl.pyに問題があります。

私のアプリには、次のような多くの URL があります。

aaa-2011-bbb
aaa-2011

これらの URL を年なしで新しい URL にリダイレクトしたいと思います。したがって、URLから年を削除する必要があります。出来ますか?

次のような静的マッピングしかありません。

(r'^aaa-\d{4}-bbb/$', redirect_to, {'url': '/aaa-bbb/'}),

しかし、年ごとにすべての URL にこのルールを書くのは好きではありません。

4

3 に答える 3

2

サブクラスRedirectView化し、それを使用して動的リダイレクトを強化します

urls.py何かのようなもの

(r'^(?P<aaa>\w+)-\d{4}-(?P<bbb>\w+)/$', MyRedirectView.as_view()),

そしてviews.py

from django.views.generic.base import RedirectView

class MyRedirectView(RedirectView):
    permanent = False
    query_string = True

    def get_redirect_url(self, aaa, bbb):
        return '%s-%s' % (aaa, bbb)

これは(文字列である**kwargs aaaと想定され、説明した URL リダイレクトから) と を取得し、構成されたリダイレクト URL を返します。bbburls.py'%s-%s' % (aaa, bbb)

于 2013-02-27T16:55:45.880 に答える
1

@danodonovan が述べたように、RedirectViewはこれを達成するための最良の方法です。

ただし、これ以上の不必要な繰り返しを避けるために、次のことを提案します。

# urls.py
(r"^([^/]*?(19|20)\d{2}[^/]*?)/?$", RemoveYearRedirect.as_view()),

# views.py
from django.views.generic.base import RedirectView
import re

class RemoveYearRedirect(RedirectView):
    query_string = True

    def get_redirect_url(self, **kwargs):
        """
        This has been overriden to remove any year from 1900 to 2099 from the URL
        """
        url = re.sub("(19|20)\d{2}", "", self.args[0])
        return "/" + re.sub("-+", "-", url).strip("-")

これは、次のような URL で機能するはずです。

  • /testing-2012-foo --> /testing-foo
  • /2000-決して起こらなかった --> /決して起こらなかった
  • /movies-from-1960 --> /movies-from
于 2013-02-27T17:34:54.117 に答える
0

より少ないコードを使用して同じことを行う別の方法:

(r'^(?P<aaa>\w+)-\d{4}-(?P<bbb>\w+)/$', RedirectView.as_view(url='%(aaa)s-%(bbb)s')),
于 2013-08-14T12:36:45.897 に答える