[django] Filtering Like a Boss -1

Hyeseong·2021년 2월 8일
3

서두 😚

이번에는 필터링 기능 구현을 위한 View 작성을 알아보종

본론🤒

스텝 0, 구현 할 화면⛷

필터링 조건이 꽤 많조?
도시, 국가, 방 유형, 가격, 침실, 침대수, 화장실수, 즉시 예약 가능유무, 수퍼호스트 유무, 어메니티 체크박스, 퍼실리티 체크박스

방금 세어봤는데 12개네요 ;;;😫 네! 쉽지 않지만! 도전정신으로 부딪처보조!

사진1

사진1+사진2

스텝 1, 일단 코드 작성⛷

def search(request):
    city = request.GET.get("city", "Anywhere")
    city = str.capitalize(city) # 만약 seoul, sEOUL, SEOUL -> Seoul로 머리글자만 대문자로 바꿔주네요.
    country = request.GET.get("country", "KR")
    room_type = int(request.GET.get("room_type", 0)) # get()메소드로 가져오면 str이기에 int()로 바꿈.
    price = int(request.GET.get("price", 0))		 # default 값을 None -> 0으로 바꿈
    guests = int(request.GET.get("guests", 0))
    bedrooms = int(request.GET.get("bedrooms", 0))
    beds = int(request.GET.get("beds", 0))
    baths = int(request.GET.get("baths", 0))
    instant = request.GET.get("instant", False)
    super_host = request.GET.get("super_host", False) # 체크박스 같이 많은 경우 getlist()로 다긁어와요.
    s_facilities = request.GET.getlist("facilities")
	s_amenities = request.GET.getlist("amenities")
    # print()로 타입과 값을 찍으면 이렇게 나와요.<class 'list'> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23']
        

    form = {
        "city": city,
        "s_room_type": room_type,
        "s_country": country,
        "price": price,
        "guests": guests,
        "bedrooms": bedrooms,
        "beds": beds,
        "baths": baths,
        "s_amenities": s_amenities,
        "s_facilities": s_facilities,
        "instant": instant,
        "super_host": super_host,
    }

    room_types = models.RoomType.objects.all()
    amenities  = models.Amenity.objects.all()
    facilities = models.Facility.objects.all()

    choices = {
        'countries'  : countries  ,
        'room_types' : room_types ,
        'room_types' : room_types ,
        'amenities'  : amenities  ,
        'facilities' : facilities ,
    }

    filter_args = {} # 딕셔너리를 사용하기 위한 껍데기를 만들어줘요.

    if city != 'Anywhere':
        filter_args['city__startswith'] = city # 쿼리스트링으로 받아온 값을 field lookup을 이용해서 key -value 로 사용하는데요.

    filter_args['country'] = country

    if room_type !=0:
        filter_args['room_type__id'] = room_type

    rooms = models.Room.objects.filter(**filter_args) # 위 필드룩업을 궁극적으로 **kwargs 로 사용해요.

    return render(request, 'rooms/search.html', context={**form, **choices, 'rooms':rooms})

결론🥰

  1. 필터링 쉽지 않음
  2. 쿼리스트링으로 값을 받아옴
  • 체크박스를 여러개 체크하는 경우 getlist()로 한방에 리스트로 묶어서 데려옴
  1. 빈 딕셔너리를 이용해서 해당 딕셔너리의 key를 field lookup으로하고 그 value를 GET방식으로 받아온 값으로 넣어줘요
  2. 그리고 filter()메소드 안에 **kwargs를 넣어줘서 확~ 풀어버리면 되겠조?
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글