Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django应用程序中实现通用搜索_Python_Django_Search_Inheritance_Django Forms - Fatal编程技术网

Python 在Django应用程序中实现通用搜索

Python 在Django应用程序中实现通用搜索,python,django,search,inheritance,django-forms,Python,Django,Search,Inheritance,Django Forms,我们有一个大型Django应用程序,它由大量不同的视图(其中一些包含表单)组成。与大多数大型应用程序一样,我们使用一个基本布局模板,其中包含应用程序中的通用布局元素(主要是页眉和页脚),所有视图的模板都扩展了这些元素 我们要做的是在我们的应用程序中创建一个通用搜索框,在每个页面上都可以访问,这允许用户在整个应用程序中执行搜索,并希望将搜索框放置在标题中,这涉及在基本布局模板中放置一个表单。这意味着我们应用程序中的每个视图都需要能够处理此搜索表单的提交。提交此搜索表单后,我们需要将用户重定向到包含

我们有一个大型Django应用程序,它由大量不同的视图(其中一些包含表单)组成。与大多数大型应用程序一样,我们使用一个基本布局模板,其中包含应用程序中的通用布局元素(主要是页眉和页脚),所有视图的模板都扩展了这些元素

我们要做的是在我们的应用程序中创建一个通用搜索框,在每个页面上都可以访问,这允许用户在整个应用程序中执行搜索,并希望将搜索框放置在标题中,这涉及在基本布局模板中放置一个
表单
。这意味着我们应用程序中的每个视图都需要能够处理此搜索表单的提交。提交此搜索表单后,我们需要将用户重定向到包含搜索结果的另一个视图

然而,我们正在努力找到一种模式来处理这个问题。有没有人知道Django内置的功能可以帮助我们构建它?如果做不到这一点,有没有人能提出一个好的策略来修改我们的应用程序,这样我们就可以处理这个用例,而不必修改大量现有的视图(目前我们没有足够的资源来做)

请注意,这个问题的重点是处理每个视图中出现的表单提交的最佳方式,而不是实现通用搜索算法的策略(我们已经找到了)

迄今为止探索的想法

  • 我们的第一个想法是创建一个基本的
    视图
    类,该类实现处理通用搜索表单提交,并让我们的每个视图对此进行扩展。但是,这是不可能的,因为我们已经有了从许多不同的Django视图类继承的视图(
    TemplateView
    ListView
    FormView
    DeleteView
    是一些示例),要能够构建我们自己的公共视图类,就意味着要么编写这些Django视图类的我们自己版本,从我们自己的视图基类继承,要么重新编写大量视图,这样它们就不会使用Django视图类
  • 我们的下一个想法是实现一个mixin,该mixin将处理通用搜索表单提交,试图以允许我们继续使用不同的Django视图类的方式将此功能添加到所有视图中。然而,这暴露了两个新问题:(a)我们如何做到这一点而不将每个视图修改为表单视图,以及(b)我们如何做到这一点,使表单处理逻辑在与现有
    FormView
    s混合时能够很好地发挥作用

您可以实现一个单独的
视图
(端点),处理所有
搜索查询,而不是在应用程序的每个视图上处理表单提交。(一个返回JSON结果的端点)因为您不想增加使用该视图呈现整个页面的开销。因此搜索查询(客户端AJAX对Web服务器执行的查询)将返回
JSON
响应,Javascript可以呈现该响应。这样,您就可以将
搜索
视图与其他视图隔离开来。(在这种情况下会有帮助)


这个
search
表单将包含在
base
模板中,因此可以从整个应用程序访问您的搜索框,并将其提交到相同的视图。AJAX函数将处理服务器响应以呈现它。

您可以实现一个单独的
视图(端点),它处理所有
搜索查询,而不是在应用程序的每个视图上处理表单提交。(一个返回JSON结果的端点)因为您不想增加使用该视图呈现整个页面的开销。因此搜索查询(客户端AJAX对Web服务器执行的查询)将返回
JSON
响应,Javascript可以呈现该响应。这样,您就可以将
搜索
视图与其他视图隔离开来。(在这种情况下会有帮助)


这个
search
表单将包含在
base
模板中,因此可以从整个应用程序访问您的搜索框,并将其提交到相同的视图。AJAX函数将处理服务器响应以呈现它。

看起来您只需要创建另一个SearchView,它接受查询并显示结果。我不确定搜索结果是否需要根据执行搜索的页面进行不同的显示,但似乎不是这样


表单与其他视图没有任何关系。您可以在基本模板中对其进行硬编码。

看起来您只需要创建另一个SearchView,它接受查询并显示结果。我不确定搜索结果是否需要根据执行搜索的页面进行不同的显示,但似乎不是这样


表单与其他视图没有任何关系。您可以在基本模板中硬编码。

这似乎是一个显而易见的问题,可能我忽略了一些东西。但正如其他人所说,您的通用搜索表单不应向呈现当前页面的视图发出POST请求

每个html表单都有一个
action
属性。搜索表单的属性应指向URL。可能类似于
/search
。该url后面会有一个视图,用于处理来自表单的POST请求并返回搜索结果。Django有URL模板标记,使这变得简单
{%url'myapp.views.search%}
将为
search
视图函数提供正确的url,如果它位于
myapp
中的
views
模块中。所以html的相关部分
<form action="{% url 'myapp.views.search' %}">
    <input type="text" name="qs" placeholder="Search">
</form>
def search(request):
    query = request.POST.get('qs', '')
    results = SomeModel.objects.filter(name=query) # Your search algo goes here
    return render(request, 'search_results.html', dict(results=results))