Paginating the results of a Django forms POST request

前端 未结 7 506
旧巷少年郎
旧巷少年郎 2020-12-04 13:39

I\'m using Django Forms to do a filtered/faceted search via POST, and I would like to Django\'s paginator class to organize the results. How do I preserve the original requ

7条回答
  •  广开言路
    2020-12-04 14:25

    Reading the very nice answer from tux21b I decided to implement the first option, i.e., to use the session to store the query. This is an application that searches real estate databases. Here is the view code (using django 1.5):

    def main_search(request):
        search_form = UserSearchForm()
        return render(request, 'search/busca_inicial.html', {'search_form': search_form})
    
    
    def result(request):
        if request.method == 'POST':
            search_form = UserSearchForm(request.POST)
            if search_form.is_valid():
                # Loads the values entered by the user on the form. The first and the second
                # are MultiChoiceFields. The third and fourth are Integer fields
                location_query_list = search_form.cleaned_data['location']
                realty_type_query_list = search_form.cleaned_data['realty_type']
                price_min = search_form.cleaned_data['price_min']
                price_max = search_form.cleaned_data['price_max']
                # Those ifs here populate the fields with convenient values if the user
                # left them blank. Basically the idea is to populate them with values
                # that correspond to the broadest search possible.
                if location_query_list == []:
                    location_query_list = [l for l in range(483)]
                if realty_type_query_list == []:
                    realty_type_query_list = [r for r in range(20)]
                if price_min == None:
                    price_min = 0
                if price_max == None:
                    price_max = 100000000
                # Saving the search parameters on the session
                request.session['location_query_list'] = location_query_list
                request.session['price_min'] = price_min
                request.session['price_max'] = price_max
                request.session['realty_type_query_lyst'] = realty_type_query_list
        # making a query outside the if method == POST. This logic makes the pagination     possible.
        # If the user has made a new search, the session values would be updated. If not,
        # the session values will be from the former search. Of course, that is what we want  because
        # we want the 'next' and 'previous' pages correspond to the original search
        realty_list_result =    FctRealtyOffer.objects.filter(location__in=request.session['location_query_list']
                                                        ).filter(price__range=(request.session['price_min'], request.session['price_max'])
                                                       ).filter(realty_type__in=request.session['realty_type_query_lyst'])
        # Here we pass the list to a table created using django-tables2 that handles sorting
        # and pagination for us
        table = FctRealtyOfferTable(realty_list_result)
        # django-tables2 pagination configuration
        RequestConfig(request, paginate={'per_page': 10}).configure(table)
    
        return render(request, 'search/search_result.html', {'realty_list_size': len(realty_list_result),
                                                          'table': table})
    

    Hope it helps!If anyone has any improvement to suggest, be welcome.

提交回复
热议问题