使用通用视图的不区分大小写的查询

时间:2012-02-18 23:14:22

标签: django case-insensitive

我希望我的网址不区分大小写。在使用通用视图时,将(?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中干净利落的指导。

1 个答案:

答案 0 :(得分:6)

URL中的大小写不敏感通常是一件坏事。资源应该只有一个URL。

但是,你可以使用:

slug_field='slug__iexact'

但是,我会改为捕获DoesNotExist异常,从URL中删除slug,使用新的slug再次尝试查询并返回重定向到正确的URL。在运行第一个查询之前,您实际上可以检查大写字母,以避免运行不必要的查询。

取决于你:)