Создание формы автозаполнения поиска (возможно, с помощью 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>