2017-01-07 3 views
0

최근에 장고 웹 응용 프로그램 검색 기능을 구현했습니다 (정상적으로 작동 함). 그러나 코드의 작동 방식을 완전히 이해하지 못했습니다. 당신은 무슨 일이 일어나고 있는지 설명해 주시겠습니까, 특히 ;:장고 검색 기능 이해

  • 어떻게 함께 & "get_contest_data"(views.py)를 작동 "get_queryset"는 무엇입니까?
  • 검색 요청 (템플릿에서)이 "get_queryset"으로 이동하는 것을 어떻게 알 수 있습니까?
  • 반송 q은 무엇입니까?

보기 :

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 

템플릿 템플릿은 PARAM "Q"에 명시된 URL에 백엔드에 GET 요청을 보낼 장고를 알려줍니다

<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

및 docs : https://docs.djangoproject.com/en/1.10/topics/class-based를 참조하십시오. -views/intro/# using-class-based-views – allcaps

답변

1

(예 www.example.com/products?q=search_term를)

Django는 url과 GET http 메서드를 ProductListView 클래스와 일치시킵니다. 여기서 q는 param으로 전달됩니다

ListView은 코드에서 확장 한 self.get_context_data() 메서드의 컨텍스트를 설정하는 BaseListView에서 상속됩니다. BaseListViewself.get_queryset() 메서드를 구현하는 MultipleObjectMixin에서 상속받습니다.

짧은 CBV (클래스 기본보기)에는 here으로 볼 수있는 여러 가지 메서드를 정의하는 상속 네트워크가 있습니다. 이 상속 체인 때문에 많은 메소드가 숨겨져 있기 때문에 문서를 읽거나 더 나은 결과를 얻기 위해 Django 소스 코드를 연구해야합니다.

return qs와 마찬가지로 qs는 확장 get_queryset() 메소드에서 반환하는 쿼리 세트입니다.

  • 당신의 제목이나 설명에 Q의 값이있는 모델의 값 Q
  • 필터링을 복용와 q의 가격이있는 모델에 대한 QS
  • 필터링에서의 검색어로 저장 및 qs2
  • 검색어 세트의 QS 및 qs2를 결합하고 각 레코드가 고유한지 제작에서의 검색어로 저장, 그 다음의 검색어를 반환하는 것은의 검색어가 ProductListView
+0

CBV에 대해 알려주고 정확한 방법을 인용 해 주셔서 감사합니다. 나는 여기에서 거꾸로 일할 수있다! – toiteam