我最近实现了Django Web应用程序的搜索功能(它工作得很好)。但是,我并不完全了解代码的工作原理。能否请您解释一下到底是怎么回事,特别;:了解此Django搜索功能
- 如何 “get_queryset” & “get_contest_data”(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>
的查询集你'ProductListView'是李'的子类stView'是'BaseListView'的子类,它有'get'方法。这个'get'在GET请求的情况下被调用,它调用'get_queryset'和'get_context_data'。见https://github.com/django/django/blob/master/django/views/generic/list.py – allcaps
而文档:https://docs.djangoproject.com/en/1.10/topics/class-based -views/intro /#using-class-based-views – allcaps