Paginating the results of a Django forms POST request

前端 未结 7 460
旧巷少年郎
旧巷少年郎 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条回答
  •  -上瘾入骨i
    2020-12-04 14:20

    My suggestion would be to store the post request using a session or a cookie. In case the post data is sensitive, you should use session to store it. The code below contains my logic to implement it using session.

    def index(request):
        is_cookie_set = 0
        # Check if the session has already been created. If created, get their values and store it.
        if 'age' in request.session and 'sex' in request.session: 
            age = request.session['age']
            sex = request.session['sex']
            is_cookie_set = 1
        else:
            # Store the data in the session object which can be used later
            request.session['age'] = age
            request.session['sex'] = sex
        if(request.method == 'POST'):
            if(is_cookie_set == 0): # form submission by the user
                form = EmployeeForm(request.POST)
                sex = form.cleaned_data['sex']
                age = form.cleaned_data['age']
                if form.is_valid():
                    result = Employee.objects.all(sex=sex,age_gte=age) # filter all employees based on sex and age
            else: # When the session has been created
                result = Employee.objects.all(sex=sex,age_gte=age)
            paginator = Paginator(result, 20) # Show 20 results per page
            page = request.GET.get('page')
            r = paginator.get_page(page)
            response = render(request, 'app/result.html',{'result':result})    
            return response
        else:
            form = EmployeeForm()
        return render(request,'app/home.html',{'form':form})
    

    You should also check if the post fields are empty or not and change the logic according to it. You can also store the whole post request in the session as suggested by @abidibo.

    You can also use cookies for the same. I have explained it here

提交回复
热议问题