2017-01-07 87 views
0

我最近实现了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> 
+0

的查询集你'ProductListView'是李'的子类stView'是'BaseListView'的子类,它有'get'方法。这个'get'在GET请求的情况下被调用,它调用'get_queryset'和'get_context_data'。见https://github.com/django/django/blob/master/django/views/generic/list.py – allcaps

+0

而文档:https://docs.djangoproject.com/en/1.10/topics/class-based -views/intro /#using-class-based-views – allcaps

回答

1

模板告诉Django在与参数 “Q” 所陈述的URL发送GET请求传递给后台(如www.example.com/products?q=search_term

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

ListView继承自BaseListView,它从您在代码中扩展的方法self.get_context_data()设置上下文。 BaseListView继承自MultipleObjectMixin,它实现了您扩展的self.get_queryset()方法。

简而言之,CBV(基类视图)有一个继承网络,它定义了它们可以看到的不同方法here。由于这种继承链,许多方法对你来说都是隐藏的,因此你需要阅读文档或者更好地学习Django源代码来弄清究竟发生了什么。

至于返回qs,qs是您在扩展的get_queryset()方法中返回的查询集。

  • 你走的是Q值
  • 滤波已在标题或描述q的值的任何模型,并把它作为在QS
  • 过滤任何模型查询集有q的价格并把它作为在QS2
  • 结合查询集QS和QS2,并确保每个记录是唯一一个查询集,然后返回该查询集使用由ProductListView
+0

谢谢你告诉我关于CBV和引用确切的方法。我可以从这里倒退! – toiteam