Pagination in django - the original query string gets lost

前端 未结 4 848
慢半拍i
慢半拍i 2021-01-12 02:23

I use the code from the documentation to paginate the data:

try:
    data = paginator.page(request.GET.get(\'page\'))
except PageNotAnInteger:
    page = 1
          


        
相关标签:
4条回答
  • 2021-01-12 02:50

    The easy way would be to include those variables in your template:

    <a href="?var1={{var1}}&var2={{var2}}&page={{ data.next_page_number }}">next</a>
    

    Just add var1 and var2 to your context.

    That's if the query string variables are originated from your backend. If they're coming from the front-end/external, you could use something like How can I get query string values in JavaScript? in your template and either edit the template vars directly or pass the values to your backend.

    0 讨论(0)
  • 2021-01-12 02:53

    You can access parameters from your request directly in your template if you activate django.core.context_processors.request in your settings. See https://docs.djangoproject.com/en/1.7/ref/templates/api/#django-core-context-processors-request

    Then you can access parameters in your template directly. In your case you'll need to filter page parameter. You could do something like this:

    href="?page={{ data.next_page_number }}{% for key, value in request.GET.items %}{% if key != 'page' %}&{{ key }}={{ value }}{% endif %}{% endfor %}"
    
    0 讨论(0)
  • 2021-01-12 03:01

    Similar to YPCrumble's answer, the following snippet works for me. But the template files could get pretty crowded when there are multiple parameters.

    <a href="?p={{ page }}{% if search %}&search={{ search }}{% endif %}">{{ page }}</a>
    

    Note that you must know the parameter names when apply this solution, so it may not fully satisfy your need.

    0 讨论(0)
  • 2021-01-12 03:14

    Another possible solution can be to construct parameters list in your view. Pros: you can use clean and expressive methods on QueryDict.

    It will be look like this:

    get_copy = request.GET.copy()
    parameters = get_copy.pop('page', True) and get_copy.urlencode()
    context['parameters'] = parameters
    

    That's it! Now you can use your context variable in template:

     href="?page={{ paginator.next_page_number }}&{{ parameters }}" 
    

    See, code looks clean and nicely.

    note: assumes, that your context contained in context dict and your paginator in paginator variable

    0 讨论(0)
提交回复
热议问题