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

Tre*_*ewq 4 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',
 )),
Run Code Online (Sandbox Code Playgroud)

以下工作:

http://mysite.com/2012/jan/24/my-article
http://mysite.com/2012/JAN/24/my-article
Run Code Online (Sandbox Code Playgroud)

以下不起作用(即我得到404):

http://mysite.com/2012/jan/24/My-Article
Run Code Online (Sandbox Code Playgroud)

我认为它不起作用的原因是因为slug的查询查询区分大小写.为了使这项工作,我相信我需要子类(不确定这是否是正确的术语),class SingleObjectMixin(object):因为这是queryset = queryset.filter(**{slug_field: slug})发生的地方.也许我应该继承get_queryset().

我很欣赏有关如何在django 1.3中干净利落地做一些指导

And*_*ram 6

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

但是,您可以使用:

slug_field='slug__iexact'
Run Code Online (Sandbox Code Playgroud)

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

由你决定 :)