在Django中创建一个合适的搜索功能

时间:2017-06-28 18:54:35

标签: django search

我正在尝试创建一个搜索功能,允许我在实例中输入对象的值,这样我就可以在搜索页面的同一页面上显示该实例及其中的几个对象。这是我到目前为止所做的:

make_test_case_gen

基本上,如果我在输入中输入姓氏,我希望它能够获取姓氏相同的所有模型实例,并且能够提供我想要的关于所有匹配的任何信息实例,例如与搜索完全相同的页面上的名称,性别和地址。 POST方法可能会令人困惑,但有人坚持认为我这样做(当我将方法更改为GET时,它无效)。有人可以指出我的代码中的任何错误或缺失部分?感谢。

编辑:添加了urls.py。

3 个答案:

答案 0 :(得分:1)

如何调试

  1. 从标记中删除操作。浏览器将自动发布到同一个URL。这排除了重定向,映射或上游urlconf的任何问题。
  2. 在浏览器中使用View Source以确保不返回任何内容,而不是由CSS或JS隐藏div。
  3. 确保找到结果:
  4. views.py

    if query:
        results = Student.objects.filter(last_name=query)
        if results.count():
            context_dict['results'] = results
        else:
            context_dict['no_results'] = query
    

    模板

    <div id="result_panel">
        {% if no_results %}
            No results returned for <q>{{ no_results }}</q>
        {% else %}
            {% for result in results %}
                {{ result.last_name }}
           {% endfor %}
        {% endif %}
    </div>
    

    请注意,上述内容永远不会为空。它应该总是展示一些东西。如果没有,则显示错误,数据存在。见第2点。

    如果显示&#34;没有结果&#34;部分,然后尝试在django shell中复制查询:

    python manage.py shell
    >>> from yourapp.models import Student
    >>> Student.objects.filter(last_name='what you typed')
    >>> Student.objects.filter(last_name__iexact='what you typed')
    >>> Student.objects.filter(last_name__icontains='what you typed')
    >>> Student.objects.count()
    

    如果前三个都没有返回结果,那么你输错字或数字4会显示你没有学生。

答案 1 :(得分:0)

所以我不会让我发表评论,所以这里说你确实(而且)应该像django模板中的列表一样对待dicts seen here.

你能发错误吗?我不确定我看错了什么。你的方法很好地适应了我的代码,所以我有点迷失。

编辑格式:

你应该编写一个编译时字典,IE:

context_dict = {
    "results": results
}
return render(request, "students/search_student.html", context_dict)

确保返回if,因此范围在适当的位置,如果你的if没有找到任何返回变量的话。

如果你一直坚持你的答案,试着在模板中引用它......

{% for result in results.results %}

您的词典有一个结果条目,指向变量结果。我相信你正在迭代你当前例子中的字典,而不是所有的查询。

答案 2 :(得分:0)

当然,您可以使用视图方法并尝试在自定义搜索和模板代码中找到错误。

或者你可以用更多的Django方式来做,依赖于Django的预构建功能:

使用Django&#39; ListView查询并显示学生模型对象。您可以免费获得分页,错误处理和上下文设置。请参阅其他StackOverflow问题,例如https://stackoverflow.com/a/33350839/621690,例如代码。

过滤学生的代码会进入/dev/null - 或者您可以使用django-filter

为了获得良好的可用性,您可以将Select2添加到表单输入中,以允许自动完成/前瞻。见django-select2