Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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_Django Models - Fatal编程技术网

Python 了解Django搜索功能

Python 了解Django搜索功能,python,django,django-models,Python,Django,Django Models,我最近为Django Web应用程序实现了一个搜索功能(它工作得很好)。然而,我并不完全理解代码的工作原理。你能具体解释一下发生了什么事吗 “获取查询集”和“获取竞赛数据”(views.py)是如何协同工作的 搜索请求(来自模板)如何知道转到“get_queryset” 什么是退货qs 视图: from django.db.models import Q class ProductListView(ListView): model = Product queryset =

我最近为Django Web应用程序实现了一个搜索功能(它工作得很好)。然而,我并不完全理解代码的工作原理。你能具体解释一下发生了什么事吗

  • “获取查询集”和“获取竞赛数据”(views.py)是如何协同工作的
  • 搜索请求(来自模板)如何知道转到“get_queryset”
  • 什么是退货qs
视图:

from django.db.models import Q

class ProductListView(ListView):
    model = Product
    queryset = Product.objects.all()

def get_context_data(self, *args, **kwargs):
    context = super(ProductListView, self).get_context_data(*args, **kwargs)
    context["now"] = timezone.now()
    context["query"] = self.request.GET.get("q") #None
    return context

def get_queryset(self, *args, **kwargs):
    qs = super(ProductListView, self).get_queryset(*args, **kwargs)
    query = self.request.GET.get("q")
    if query:
        qs = self.model.objects.filter(
            Q(title__icontains=query) |
            Q(description__icontains=query)
            )
        try:
            qs2 = self.model.objects.filter(
                Q(price=query)
            )
            qs = (qs | qs2).distinct()
        except:
            pass
    return qs
模板

<form class="navbar-form navbar-left" method="GET" role="search"   action='{% url "products" %}'>
<div class="form-group">
<input type="text" class="form-control" placeholder="Search" name="q">
</div>
</form>

模板告诉Django使用参数“q”(例如
www.example.com/products?q=search_term
)在指定的url向后端发送GET请求

Django将url和GET http方法与类ProductListView相匹配,其中q作为参数传递

ListView
继承自
BaseListView
,它从方法
self.get\u context\u data()
中设置上下文,您在代码中扩展了该方法
BaseListView
继承自
MultipleObjectMixin
,它实现了您扩展的
self.get\u queryset()
方法

简而言之,CBV(类基本视图)有一个继承网络,它定义了可以看到的不同方法。由于这种继承链,许多方法对您是隐藏的,因此您要么需要阅读文档,要么更好地研究Django源代码,以了解到底发生了什么

至于返回qs,qs是您在扩展的
get\u queryset()
方法中返回的查询集

  • 你取的是q值
  • 筛选标题或描述中具有q值的任何模型,并将其存储为qs中的queryset
  • 过滤任何价格为q的模型,并将其存储为qs2中的查询集
  • 组合查询集qs和qs2并确保每个记录都是唯一的,然后将该查询集返回为
    ProductListView使用的查询集

您的
ProductListView
ListView的子类
BaseListView的子类
它有一个
get
方法。在get请求的情况下调用此
get
,它调用
get\u queryset
get\u context\u data
。请参阅和文档:感谢您告诉我有关CBV的信息并引用确切的方法。我可以从这里向后工作!