使用来自 IMDBPy 的综合(巨大)电影片名列表(Django 项目)创建自动完成搜索表单(可能带有 jQuery)

Creating an autocomplete search form (probably w/ jQuery) using a comprehensive (huge) movie title list (Django project) from IMDBPy

我正处于通过 Python 包 IMDBPy 检索 IMDB 数据的早期阶段(their site) (proj github). I have been referring to this nice IMDBPy implementation 寻求我在这里所做的各方面的帮助。我正在处理的几个问题使用以“嵌套字典”形式出现的生成数据集,例如 '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>

基本上,在这个阶段,我想列出所有可能的电影名称的大量列表,并根据用户输入的前几个字母进行标题搜索来缩小范围。为了在搜索栏下方自动完成 drop-down,需要显示其中的五六个。

所以,是的,这其中有很多变化的部分。有一个巨大的电影片名数据库的切片,我们使用用户输入的前几个字母过滤掉它。在某些时候,HTML 的 jQ 部分中出现的 var 数组需要填充将在 drop-down 自动完成中显示的值。我不确定 HTML 模板中的数组在变得完全笨拙、视觉上或 performance-wise 之前可以有多大。我不知道 Django 项目的这些不同组件是否可以如此动态、快速地交互。我不知道在项目的这个阶段我是否采取了合理的方法来实现我的目标。

对于我正在进行的全部或部分工作的任何提示,我们将不胜感激!

编辑:在我的训练营课程中,我们还没有达到 Ajax。猜猜这可能只是 easily/dynamically 将内容从大型数据库传输到前端的事情,嗯?

编辑 2:也许我应该尝试将 IMDB 数据(作为字典的字典)格式化为 JSON?与数据翻译一起工作会更好吗?我没有太多地使用 JsonResponse 或其他 json-related 包。

您正在迭代格式为 {'movie_1100000': }

的字典的 k1, v1

然后迭代 Movie 实例的键和值 k2、v2(其行为类似于字典) 从那里,您只过滤包含 'title' 的 k2 个键;有各种各样的,比如 'title'、'canonical title'、 'long imdb canonical title' 和其他各种方法(参见 Movie class 的 _additional_keys 方法)。 然后打印它的值。

显然默认情况下 directly access a key in a Django template 是不可能的,所以你必须遍历每个键并找到你想要的精确匹配。

这应该有效:

<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>