2016-05-23 64 views
1

请,麻烦帮忙:Django的 - 过滤器(__icontains)不起作用

class SearchResultView(TemplateView): 
    template_name = "search_result.html" 

    def get_context_data(self, **kwargs): 
     context = super(SearchResultView, self).get_context_data(**kwargs) 
     location = self.request.GET['location'] 
     locations_searched = Location.objects.filter(name__icontains=location) 
     context['locations_searched'] = locations_searched 
     return context 

class AdvancedSearchForm(forms.Form): 
    location = forms.CharField(label=u"Локация:") 

当位置字段中输入大写的话,我可以看到导致的观点,而不是资本的时候 - 没有在显示查看

谢谢!

+1

您是否正在使用SQlite数据库? – solarissmoke

回答

2

我猜你正在使用SQLite数据库,并在输入中有一些非ASCII字符。来自SQLite FAQs

Unicode字符不区分大小写的匹配不起作用。 SQLite的默认配置只支持不区分大小写的ASCII字符比较。原因在于,要进行完整的Unicode区分大小写比较和大小写转换,需要表和逻辑,这些大小几乎是SQLite库的两倍。

Django的documentation也提到了这一点:

对于所有SQLite的版本,有试图匹配一些类型的字符串时,微微有些反直觉 行为。这些是 当在查询集中使用iexact或包含过滤器时触发的...

+0

非常感谢!它变成了我必须自己意识到这一点?可能会通过大写/小写转换?或者可能是我应该改变DB :) – Dennis

+0

你会在生产中使用SQlite(不推荐!)吗?如果没有,那么一旦切换到像Postgres或MySQL这样的生产数据库,问题就会消失。否则,是的,您可能必须在将输入传递给过滤器之前手动将输入小写。 – solarissmoke