장고:검색기능: 두 판 사이의 차이

학교의 모든 지식. SMwiki
둘러보기로 이동 검색으로 이동
편집 요약 없음
편집 요약 없음
2번째 줄: 2번째 줄:


==개요==
==개요==
검색기능은 DB에 쿼리하는 방식으로 이루어진다.
검색기능은 DB에 쿼리하는 방식으로 이루어진다.<br />
<br />


==view 수정==
==view 수정==
25번째 줄: 24번째 줄:
             ).distinct()  # 중복된 내용이 있으면 제거하는 함수.
             ).distinct()  # 중복된 내용이 있으면 제거하는 함수.
         question_list = result  # 모은 결과를 리스트에 담는다.
         question_list = result  # 모은 결과를 리스트에 담는다.
</syntaxhighlight>POST방식이 아니라 GET으로 받아오는 것은 뒤로가기 버튼을 누를 때 '만료된 페이지입니다'라는 문구가 뜨기 때문이다. 그럼 다시 찾아들어가야 하고.. 불편해.
</syntaxhighlight>


('만료된 페이지입니다' 문구는 POST요청 시 중복요청을 방지하기 위해 발생시키는 오류이다.)
* POST방식이 아니라 GET으로 받아오는 것은 뒤로가기 버튼을 누를 때 '만료된 페이지입니다'라는 문구가 뜨기 때문이다. 그럼 다시 찾아들어가야 하고.. 불편해.
* ('만료된 페이지입니다' 문구는 POST요청 시 중복요청을 방지하기 위해 발생시키는 오류이다.)
* <code>subject__contains</code> 대신 <code>subject__icontains</code> 형태를 사용하는 건 i를 붙였을 때 대소문자 구분없이 찾아주기 때문이다.

2020년 12월 4일 (금) 15:33 판

장고! 웹 프레임워크! 틀:장고

  1. 장고:개요
  2. 장고:웹페이지설계
    1. 장고:앱
    2. 장고:url
    3. 장고:model
      1. 장고:DB
      2. 장고:모델 필드
      3. 장고:모델의 변경
    4. 장고:view
      1. 장고:클래스형 뷰, 제네릭 뷰
      2. 장고:view 각종 기능
    5. 장고:template
    6. 장고:static. 정적파일 사용하기
      1. 장고:CSS 사용하기
      2. 장고:JS 사용하기
      3. 장고:글꼴 사용
      4. 장고:부트스트랩
    7. 장고:media. 미디어 파일 사용하기
  3. 장고:관리자페이지
  4. 장고:settings.py
  5. 장고:기능구현
    1. 장고:회원관리
    2. 장고:유저
    3. 장고:커스텀 유저
    4. 장고:소셜로그인
    5. 장고:입력받기
    6. 장고:저장된 내용 활용하기
    7. 장고:변수 내보내기
    8. 장고:글쓰기
    9. 장고:페이징(페이지나누기)
    10. 장고:답변쓰기(댓글쓰기)
    11. 장고:추천,즐겨찾기
    12. 장고:새글(최신글) 나타내기
    13. 장고:썸머노트 설치
    14. 장고:네비게이션 바 만들기
    15. 장고:검색기능
    16. 장고:카테고리 만들기
    17. 장고:사진 올리기
    18. 장고:파일 업로드
    19. 장고:이메일app 만들기
    20. 장고:매직 그리드
  6. 장고:웹서비스
    1. 장고:Git
    2. 장고:리눅스에 올리기
    3. 장고:우분투에 올리기(nginx 사용)
    4. 장고:도커로 올리기
  7. 장고:팁

개요

검색기능은 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요청 시 중복요청을 방지하기 위해 발생시키는 오류이다.)
  • subject__contains 대신 subject__icontains 형태를 사용하는 건 i를 붙였을 때 대소문자 구분없이 찾아주기 때문이다.