Django How to Add Pagination to Blog Application
Django Build a blog application with bootstrap and Automatically Generate slugs
#views.py from django.shortcuts import render, redirect from django.views import generic from myapp.models import Post from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage def index(request): object_list = Post.objects.filter(status=1).order_by('-created_on') paginator = Paginator(object_list, 3) # 3 posts in each page page = request.GET.get('page') try: post_list = paginator.page(page) except PageNotAnInteger: # If page is not an integer deliver the first page post_list = paginator.page(1) except EmptyPage: # If page is out of range deliver last page of results post_list = paginator.page(paginator.num_pages) return render(request, 'index.html', {'page': page, 'post_list': post_list}) class PostDetail(generic.DetailView): model = Post template_name = 'post_detail.html'
//templates/index.html {% extends 'base.html' %} {% block content %} {% for post in post_list %} <div class="post-preview"> <a href="{% url 'post_detail' post.slug %}"> <h2 class="post-title"> {{ post.title }} </h2> <h3 class="post-subtitle"> {{post.content|slice:":200" }} </h3> </a> <p class="post-meta">Posted by {{ post.author }} | {{ post.created_on}} </p> </div> <hr> {% endfor %} <div class="clearfix"> {% if post_list.has_other_pages %} <nav aria-label="Page navigation conatiner"> <ul class="pagination justify-content-center"> {% if post_list.has_previous %} <li><a href="?page={{ post_list.previous_page_number }}" class="page-link">« PREV </a></li> {% endif %} {% if post_list.has_next %} <li><a href="?page={{ post_list.next_page_number }}" class="page-link"> NEXT »</a></li> {% endif %} </ul> </nav> {% endif %} </div> </div> {% endblock %}
#models.py from django.db import models from django.contrib.auth.models import User from django.utils.text import slugify STATUS = ( (0,"Draft"), (1,"Publish") ) class Post(models.Model): title = models.CharField(max_length=200, unique=True) slug = models.SlugField(max_length=200, unique=True) author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='myapp_post') updated_on = models.DateTimeField(auto_now= True) content = models.TextField() created_on = models.DateTimeField(auto_now_add=True) status = models.IntegerField(choices=STATUS, default=0) class Meta: ordering = ['-created_on'] def __str__(self): return self.title class Meta: db_table = "myapp_post" def save(self, *args, **kwargs): value = self.title self.slug = slugify(value, allow_unicode=True) super().save(*args, **kwargs)