我希望我的网址不区分大小写。在使用通用视图时,将(?i)添加到urls.py中正则表达式的开头不起作用。
以下是我想关注的网址:
url(r'^(?i)(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-A-Za-z0-9_]+)/$', BlogDateDetailView.as_view(model=Entry,
queryset=Entry.objects.all(),
date_field='pub_date',
slug_field='slug',
)),
以下工作:
http://mysite.com/2012/jan/24/my-article
http://mysite.com/2012/JAN/24/my-article
以下不起作用(即我得到404):
http://mysite.com/2012/jan/24/My-Article
我认为它不起作用的原因是因为slug的查询查询区分大小写。为了使这项工作,我相信我需要子类化(不确定这是否是正确的术语)class SingleObjectMixin(object):
,因为这是queryset = queryset.filter(**{slug_field: slug})
发生的地方。也许我应该继承get_queryset()
。
我很欣赏有关如何在django 1.3中干净利落的指导。
答案 0 :(得分:6)
URL中的大小写不敏感通常是一件坏事。资源应该只有一个URL。
但是,你可以使用:
slug_field='slug__iexact'
但是,我会改为捕获DoesNotExist异常,从URL中删除slug,使用新的slug再次尝试查询并返回重定向到正确的URL。在运行第一个查询之前,您实际上可以检查大写字母,以避免运行不必要的查询。
取决于你:)