장고:검색기능: 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
(새 문서: {{장고}} == 개요 == 검색기능은 DB에 쿼리하는 방식으로 이루어진다. <br /> == view 수정 == 목록을 조회하는 view를 수정한다.<syntaxhighlight lang="...) |
편집 요약 없음 |
||
1번째 줄: | 1번째 줄: | ||
{{장고}} | {{장고}} | ||
== 개요 == | ==개요== | ||
검색기능은 DB에 쿼리하는 방식으로 이루어진다. | 검색기능은 DB에 쿼리하는 방식으로 이루어진다. | ||
<br /> | <br /> | ||
== view 수정 == | ==view 수정== | ||
목록을 조회하는 view를 수정한다. | 목록을 조회하는 view를 수정한다. | ||
다음과 같은 형태로<syntaxhighlight lang="python"> | |||
from django.db.models import Q # 검색을 위함. filter에서 OR조건으로 조회하기 위한 함수.(장고제공) | |||
if keyword: | def list(request): | ||
question_list = Question.objects.order_by('-create_date') # 일단 객체 목록을 받아온다. | |||
keyword = request.GET.get('keyword', '') # 검색어. ''는 왜 필요할까? 없어도 되나? | |||
if keyword: # 검색어가 있다면 | |||
result = [] # 검색결과를 담기 위한 리스트를 만든다. | |||
keywords = keyword.split(' ') # 공백이 있는 경우 나눈다. | |||
for kw in keywords: # 띄어쓰기로 검색을 하는 경우가 많으니까, 다 찾아줘야지. | |||
result += question_list.filter( # 검색해서 검색결과에 더한다. | |||
Q(subject__icontains=kw) | # 제목검색 | |||
Q(content__icontains=kw) | # 내용검색 | |||
Q(author__username__icontains=kw) | # # question모델의 상위인 user모델의 username에서 검색. | |||
Q(answer__author__username__icontains=kw) # 하위모델인 answer모델의 참조인 user모델의 username에서 검색. | |||
).distinct() # 중복된 내용이 있으면 제거하는 함수. | |||
question_list = result # 모은 결과를 리스트에 담는다. | |||
</syntaxhighlight>POST방식이 아니라 GET으로 받아오는 것은 뒤로가기 버튼을 누를 때 '만료된 페이지입니다'라는 문구가 뜨기 때문이다. 그럼 다시 찾아들어가야 하고.. 불편해. | </syntaxhighlight>POST방식이 아니라 GET으로 받아오는 것은 뒤로가기 버튼을 누를 때 '만료된 페이지입니다'라는 문구가 뜨기 때문이다. 그럼 다시 찾아들어가야 하고.. 불편해. | ||
('만료된 페이지입니다' 문구는 POST요청 시 중복요청을 방지하기 위해 발생시키는 오류이다.) | ('만료된 페이지입니다' 문구는 POST요청 시 중복요청을 방지하기 위해 발생시키는 오류이다.) |
2020년 12월 3일 (목) 20:36 판
장고! 웹 프레임워크! 틀:장고
개요
검색기능은 DB에 쿼리하는 방식으로 이루어진다.
view 수정
목록을 조회하는 view를 수정한다.
다음과 같은 형태로
from django.db.models import Q # 검색을 위함. filter에서 OR조건으로 조회하기 위한 함수.(장고제공)
def list(request):
question_list = Question.objects.order_by('-create_date') # 일단 객체 목록을 받아온다.
keyword = request.GET.get('keyword', '') # 검색어. ''는 왜 필요할까? 없어도 되나?
if keyword: # 검색어가 있다면
result = [] # 검색결과를 담기 위한 리스트를 만든다.
keywords = keyword.split(' ') # 공백이 있는 경우 나눈다.
for kw in keywords: # 띄어쓰기로 검색을 하는 경우가 많으니까, 다 찾아줘야지.
result += question_list.filter( # 검색해서 검색결과에 더한다.
Q(subject__icontains=kw) | # 제목검색
Q(content__icontains=kw) | # 내용검색
Q(author__username__icontains=kw) | # # question모델의 상위인 user모델의 username에서 검색.
Q(answer__author__username__icontains=kw) # 하위모델인 answer모델의 참조인 user모델의 username에서 검색.
).distinct() # 중복된 내용이 있으면 제거하는 함수.
question_list = result # 모은 결과를 리스트에 담는다.
POST방식이 아니라 GET으로 받아오는 것은 뒤로가기 버튼을 누를 때 '만료된 페이지입니다'라는 문구가 뜨기 때문이다. 그럼 다시 찾아들어가야 하고.. 불편해.
('만료된 페이지입니다' 문구는 POST요청 시 중복요청을 방지하기 위해 발생시키는 오류이다.)