최근에 장고 웹 응용 프로그램 검색 기능을 구현했습니다 (정상적으로 작동 함). 그러나 코드의 작동 방식을 완전히 이해하지 못했습니다. 당신은 무슨 일이 일어나고 있는지 설명해 주시겠습니까, 특히 ;:장고 검색 기능 이해
- 어떻게 함께 & "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>
사용할 수 있도록 귀하의'ProductListView' 리튬'의 서브 클래스입니다 stView'는'BaseListView'의 하위 클래스로서'get' 메소드를 가지고 있습니다. 이'get'는 GET 요청의 경우에 호출되며'get_queryset'와'get_context_data'를 호출합니다. https://github.com/django/django/blob/master/django/views/generic/list.py – allcaps
및 docs : https://docs.djangoproject.com/en/1.10/topics/class-based를 참조하십시오. -views/intro/# using-class-based-views – allcaps