Диакритические знаки в функции поиска с учетом регистра
У меня есть функция поиска в моем приложении Django:
#search
def search(request):
if request.method == "POST":
searched = request.POST['searched']
result = Post.objects.filter(title__contains=searched)
return render(request, 'blog/searched.html', {'searched':searched, 'result':result})
else:
return render(request, 'blog/searched.html',{})
Проблема в том, что при поиске я получаю следующие результаты:
Zaštita -> I get 'Zaštita' result
zaštita -> I get 'Zaštita' result
Čep -> I get 'Čep' result
čep -> I get nothing (diacritic letter in the first place, case sensitive)
Вы можете использовать __icontains поиск [Django-doc] для осуществления бесконтактного поиска. Однако обычно поиск осуществляется через GET-запрос: POST-запросы обычно используются для действий, изменяющих состояние, или при отправке конфиденциальных данных.
Таким образом, вы можете искать с помощью:
def search(request):
searched = request.GET.get('searched')
result = Post.objects.all()
if searched is not None:
result = result.filter(title__icontains=searched)
return render(request, 'blog/searched.html', {'searched':searched, 'result':result})
Note: While using the
__icontainslookup [Django-doc] produces results for text, this often is still a poor way to search, since it will only fetch items with the exact string. Usually one uses solutions like Elastic or Solr, or one can uses PostgreSQL's__searchlookup [Django-doc].