我在 django中遇到 url.py的问题。
在我的应用程序中,我有很多网址,例如:
aaa-2011-bbb
aaa-2011
我想将这些网址重定向到没有年份的新网址。所以我需要从网址中删除年份。是否可以?
我只有这样的静态映射:
(r'^aaa-\d{4}-bbb/$', redirect_to, {'url': '/aaa-bbb/'}),
但我不喜欢为每个带有年份的网址写这条规则。
我在 django中遇到 url.py的问题。
在我的应用程序中,我有很多网址,例如:
aaa-2011-bbb
aaa-2011
我想将这些网址重定向到没有年份的新网址。所以我需要从网址中删除年份。是否可以?
我只有这样的静态映射:
(r'^aaa-\d{4}-bbb/$', redirect_to, {'url': '/aaa-bbb/'}),
但我不喜欢为每个带有年份的网址写这条规则。
我将子类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
andbbb
来自urls.py
(假设是字符串和来自您描述的 url 重定向)并返回组成的重定向 url'%s-%s' % (aaa, bbb)
正如@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:
使用更少代码的另一种方法:
(r'^(?P<aaa>\w+)-\d{4}-(?P<bbb>\w+)/$', RedirectView.as_view(url='%(aaa)s-%(bbb)s')),