Создание формы автозаполнения поиска (возможно, с помощью jQuery) с использованием полного (огромного) списка названий фильмов (проект Django) из IMDBPy

Я нахожусь на ранних стадиях получения данных IMDB через Python пакет IMDBPy ( их сайт) (proj github). Я обращался к этой хорошей реализации IMDBPy за помощью в некоторых аспектах того, что я делаю здесь. Некоторые из запросов, которые я использую, генерируют наборы данных, представленные в форме "вложенного словаря", например, 'movie_1':{'title':'One Flew Over the Cuckoo's Nest', 'director':'Milos Forman'...}. Моя ранняя версия поиска названия фильма принимает такую форму в VIEWS.PY:

def index(request):
    imdb = IMDb()
    test_movies = {}
    for i in range(1100000, 1100015):
        test_movies[f'movie_{i}'] = imdb.get_movie(f'{i}')
    context = {
        'test_movies':test_movies,
    }
    return render(request, 'index.html', context)

А это в моем шаблоне INDEX.HTML:

<div id="search-part1">
  <ul>
    {% for k1,v1 in test_movies.items %}
    {% for k2,v2 in v1.items %}
    {% if 'title' in k2 %}
    <li>{{v2}}</li>
    {% endif %}
    {% endfor %}
    {% endfor %}
  </ul>
  <input type="text" name="search" id="search" class="form-control" placeholder="Search for Movies">
</div>

Сейчас HTML просто показывает, что я *могу генерировать список этих названий. Моя фактическая реализация выпадающего списка из строки поиска (через jQuery's Autocomplete), на данный момент, находится немного дальше по пути. Вот пример автозаполнения в действии, который приводится в документации jQuery:

<script>
  $( function() {
    var availableTags = [
      "ActionScript",
      "AppleScript",
      "Asp",
      "BASIC",
      "C",
      "C++",
      "Clojure",
      "COBOL",
      "ColdFusion",
      "Erlang",
      "Fortran",
      "Groovy",
      "Haskell",
      "Java",
      "JavaScript",
      "Lisp",
      "Perl",
      "PHP",
      "Python",
      "Ruby",
      "Scala",
      "Scheme"
    ];
    $( "#tags" ).autocomplete({
      source: availableTags
    });
  } );
  </script>

По сути, на данном этапе я хочу составить огромный список всех возможных названий фильмов и сузить его на основе первых нескольких букв, которые пользователь вводит для поиска названия. Пять или шесть из них должны появиться в выпадающем списке автозаполнения под строкой поиска

Итак, да, в этом деле много движущихся частей. Есть кусочек огромной, огромной базы данных названий фильмов, которые мы отфильтровываем, используя первые несколько букв, которые вводит пользователь. В какой-то момент массив var, который появляется в разделе jQ HTML, должен быть заполнен значениями, которые будут показаны в выпадающем автозаполнении. Я не уверен, насколько большим может быть этот массив в шаблоне HTML, прежде чем он станет совершенно громоздким, визуально или с точки зрения производительности. Я не знаю, могут ли эти различные компоненты проекта Django взаимодействовать так динамично и быстро. Я не знаю, использую ли я разумный подход к достижению своих целей на этом этапе проекта.

Любые советы в отношении всего или даже части того, что я делаю, будут очень признательны!

Вы выполняете итерацию над k1, v1 диктанта с форматом {'movie_1100000': <Movie Object>}

Затем вы перебираете ключи и значения k2, v2 экземпляра Movie (который ведет себя как диктант). Отсюда вы фильтруете только те ключи k2, которые содержат 'title'; существуют различные, такие как 'title', 'canonical title', 'long imdb canonical title' и различные другие (см. метод _additional_keys класса Movie). А затем вы печатаете его значение.

По-видимому, по умолчанию невозможно прямой доступ к ключу в шаблоне Django, поэтому вам придется перебирать каждый ключ и находить точное соответствие, которое вам нужно.

Это должно работать:

<div id="search-part1">
  <ul>
    {% for k1,v1 in test_movies.items %}
    {% for k2,v2 in v1.items %}
    {% if k2 == 'title' %}
    <li>{{v2}}</li>
    {% endif %}
    {% endfor %}
    {% endfor %}
  </ul>
  <input type="text" name="search" id="search" class="form-control" placeholder="Search for Movies">
</div>
Вернуться на верх