티스토리 뷰

반응형

Search - 여러개의 필드로 검색하기

사용하는 객체가 여러 개의 데이터 필드를 가지고 있는 경우, 여러 필드를 사용해서 검색할 수 있다. 또한, 키워드 뿐 아니라 각각의 필드가 가지고 있는 데이터를 불러와 선택해서 검색한다.

Web Search View - 사용자 검색 화면 설정

데이터베이스에서 각 필드의 유니크한 데이터를 가져온다. 이렇게 수집된 데이터를 context 를 통해서 화면으로 보낸다

 

search form template ( 화면 구성)

search 버튼을 클릭하면 검색데이터와 함께 search url 을 호출하게 된다.

  • 각 필드는 가져온 데이터를 가지고 옵션을 만든다.
<form action="{% url 'search' %}" method="">
                <!-- keyword search  -->
                <div class="form-group">
                    <input type="text" name="keyword" placeholder="Search by name" class="form-control">
                </div>

                <div class="form-group">
                    <select class="form-control search-fields" name="model">
                        <option selected="true" disabled="disabled">Model</option>
                        {% for model in model_search %}
                            <option value="{{model}}">{{model}}</opton>
                        {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    <select class="form-control search-fields" name="city">
                        <option selected="true" disabled="disabled">Location</option>
                        {% for city in city_search %}
                            <option value="{{city}}">{{city}}</opton>
                        {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    <select class="form-control search-fields" name="year">
                        <option selected="true" disabled="disabled">Year</option>
                        {% for year in year_search %}
                            <option value="{{year}}">{{year}}</opton>
                        {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    <select class="form-control search-fields" name="body_style">
                        <option selected="true" disabled="disabled">Body Style</option>
                        {% for body in body_style_search %}
                            <option value="{{body}}">{{body}}</opton>
                        {% endfor %}
                    </select>
                </div>
                <div class="range-slider clearfix">
                                <label>Price</label>
                                <div data-min="0" data-max="150000"  data-min-name="min_price" data-max-name="max_price" data-unit="USD" class="range-slider-ui ui-slider" aria-disabled="false"></div>
                                <div class="clearfix"></div>
                            </div>
                <div class="form-group">
                    <button class="btn btn-block button-theme btn-md">
                        <i class="fa fa-search"></i> Search
                    </button>
                </div>
            </form>

검색 실행 시 보여지는 url 정보

  • 입력한 정보의 데이터만 url로 전송된다. search 에서는 이 정보를 바탕으로 검색한다.

Search view - 서버 데이터 검색

url 요청 정보를 이용해서 데이터 검색을 수행한다.

  • 필드별로 요청 정보를 확인해서 검색
def search(request):
    cars = Car.objects.order_by('-created_date').all()

    if 'keyword' in request.GET: 
        keyword = request.GET['keyword']
        if keyword: 
            cars = cars.filter(description__icontains=keyword)

    if 'model' in request.GET: 
        model = request.GET['model']
        if model: 
            cars = cars.filter(model__iexact=model)

    if 'city' in request.GET: 
        city = request.GET['city']
        if city: 
            cars = cars.filter(city__iexact=city)

    if 'year' in request.GET: 
        year = request.GET['year']
        if year: 
            cars = cars.filter(year__iexact=year)
    
    if 'body_style' in request.GET: 
        body_style = request.GET['body_style']
        if body_style: 
            cars = cars.filter(body_style__iexact=body_style)

    if 'min_price' in request.GET: 
        min_price = request.GET['min_price']
        max_price = request.GET['max_price']

        if max_price: 
            cars = cars.filter(price__gte=min_price, price__lte=max_price)


    context = {
        'cars': cars, 
    }

 

목 차

장고 - 페이지 설정 ( paginator 사용하기)

Django - 검색(Search) 기능 구현하기

Search - 여러개의 필드로 검색하기 

댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함