Диакритические знаки в функции поиска с учетом регистра

У меня есть функция поиска в моем приложении 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 __icontains lookup [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 __search lookup [Django-doc].

Вернуться на верх