Table of Contents

How to setup pagination using MongoDB and Django

In your views.py file...

import urllib.parse
username = urllib.parse.quote_plus('username')
password = urllib.parse.quote_plus('password')
Mongo db setup.
from pymongo import MongoClient
client = MongoClient('mongodb://%s:%s@localhost:27017'%(username,password))
db = client.ubuddy

Let us write a function which will take letter and page number as inputs...

def show_docs(request,letter,page_no)

Let us initialize a list which will contain the records to show on the site

records = []

For a give letter such as a, we want to show all the records starting with a on page 1, below code builds a Python regex to do that

session_pat = re.compile("^%s"%letter, re.IGNORECASE)

Next we want to decide on each page how many links we want to show. I am showing 20 links here.  

skipno = (int(page_no)-1)*20

Now we want to query MongoDb and get first 20 documents that I would show on page 1. Before I limit the number of docs to 20, I need to sort them. Here is how to do that...  

docs = db.session_info.find({'slug':session_pat}).sort("slug",-1).skip(skipno).limit(20)

Now you loop through the docs and do any post processing, you need to do that. In my case I have data spread between different collections so i need to query different collections. 

 for doc in docs:
    record = {}
    session = doc['session']
    key = {'session':session}
    session_main_info = collection_sessions.find_one(key)
    session_ss_info = collection_ss.find_one(key)
    if session_ss_info and session_main_info:
      record['slug'] = doc['slug']
      record['use_slug'] = session_main_info['use_slug']
      record['user'] = session_main_info['username']
    record['session'] = session
    records.append(record)

Now I have the records list ready. Lets calculate how big your pagination will be for a give letter. You query mongoDB for the total number of docs and divide it by 20.

 no_of_docs = db.session_info.find({'slug':session_pat}).count()
 no_of_pages = int(no_of_docs/20) + 1

 Now you just to build the context and return context

context = {'letter':letter,'no_of_pages':range(1,no_of_pages+1),'records':records,'page_no':page_no}
return render(request, 'paginate.html',context)

Here is the complete code...

def show_docs(request,letter,page_no):
  records = []
  session_pat = re.compile("^%s"%letter, re.IGNORECASE)
  skipno = (int(page_no)-1)*20
  docs = db.session_info.find({'slug':session_pat}).sort("slug",-1).skip(skipno).limit(20)
  for doc in docs:
    record = {}
    session = doc['session']
    key = {'session':session}
    session_main_info = collection_sessions.find_one(key)
    session_ss_info = collection_ss.find_one(key)
    if session_ss_info and session_main_info:
      record['use_slug'] = session_main_info['use_slug']
      record['slug'] = doc['slug']
      record['user'] = session_main_info['username']
    record['session'] = session
    records.append(record)
  no_of_docs = db.session_info.find({'slug':session_pat}).count()
  no_of_pages = int(no_of_docs/20) + 1
  context = {'letter':letter,'no_of_pages':range(1,no_of_pages+1),'records':records,'page_no':page_no}
  return render(request, 'paginate.html',context)


Related Posts