Python 了解Django搜索功能
我最近为Django Web应用程序实现了一个搜索功能(它工作得很好)。然而,我并不完全理解代码的工作原理。你能具体解释一下发生了什么事吗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 =
- “获取查询集”和“获取竞赛数据”(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的信息并引用确切的方法。我可以从这里向后工作!