Register App
1 2 3 4 5 6 7 8 9 10 11 | / / blogsite / settings.py INSTALLED_APPS = [ 'django.contrib.admin' , 'django.contrib.auth' , 'django.contrib.contenttypes' , 'django.contrib.sessions' , 'django.contrib.messages' , 'django.contrib.staticfiles' , 'myapp' , #add myapp ] |
Bootstrap 4
https://getbootstrap.com/docs/4.5/getting-started/introduction/
https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.cs
Jquery
https://jquery.com/download/
CDN : jsDelivr CDN
https://www.jsdelivr.com/package/npm/jquery
https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js
myapp/templates/base.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #myapp/templates/base.html { % load static % } <!doctype html> <html lang = "en" > <head> <meta charset = "utf-8" > <meta name = "viewport" content = "width=device-width, initial-scale=1, shrink-to-fit=no" > <link rel = "stylesheet" href = "https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity = "sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin = "anonymous" > <title>Python Django Load More Data using jquery Ajax< / title> < / head> <body> <div class = "container mt-3" > <p><h1>Python Django Load More Data using jquery Ajax< / h1>< / p> { % block content % }{ % endblock content % } < / div> <script> const postsBox = document.getElementById( 'posts-box' ) console.log(postsBox) const spinnerBox = document.getElementById( 'spinner-box' ) const loadBtn = document.getElementById( 'load-btn' ) const loadBox = document.getElementById( 'loading-box' ) let visible = 3 const handleGetData = () = > { $.ajax({ type : 'GET' , url: ` / posts - json / ${visible} / `, success: function(response){ maxSize = response. max const data = response.data spinnerBox.classList.remove( 'not-visible' ) setTimeout(() = >{ spinnerBox.classList.add( 'not-visible' ) data. map (post = >{ console.log(post. id ) postsBox.innerHTML + = `<div class = "card p-3 mt-3 mb-3" > ${post.post_title} <br> ${post.post_content} < / div>` }) if (maxSize){ console.log( 'done' ) loadBox.innerHTML = "<h4>No more posts to load</h4>" } }, 500 ) }, error: function(error){ console.log(error) } }) } handleGetData() loadBtn.addEventListener( 'click' , () = >{ visible + = 3 handleGetData() }) < / script> <style> . not - visible { display: none; } < / style> < / body> < / html> |
1 2 3 4 5 6 7 8 9 10 11 12 | #myapp/templates/main.html { % extends "base.html" % } { % block content % } <div id = "posts-box" >< / div> <div id = "spinner-box" class = "not-visible" > <div class = "spinner-border text-primary" role = "status" >< / div> < / div> <div id = "loading-box" > <button class = "btn btn-primary" id = "load-btn" >Load more< / button> < / div> { % endblock content % } |
Make Migrations
Run the commands below to make migrations:
python manage.py makemigrations
python manage.py migrate
C:\django\blogsite>python manage.py makemigrations
C:\django\blogsite>python manage.py migrate
myapp/models.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #myapp/models.py from django.db import models # Create your models here. class Post(models.Model): post_title = models.CharField(max_length = 200 ) post_content = models.TextField() created = models.DateTimeField(auto_now_add = True ) def __str__( self ): return str ( self .pk) class Meta: ordering = ( '-created' ,) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #myapp/views.py from django.shortcuts import render from django.views.generic import View, TemplateView from .models import Post from django.http import JsonResponse class MainView(TemplateView): template_name = 'main.html' class PostJsonListView(View): def get( self , * args, * * kwargs): print (kwargs) upper = kwargs.get( 'num_posts' ) lower = upper - 3 posts = list (Post.objects.values()[lower:upper]) posts_size = len (Post.objects. all ()) max_size = True if upper > = posts_size else False return JsonResponse({ 'data' : posts, 'max' : max_size}, safe = False ) |
1 2 3 4 5 6 7 8 9 10 11 | #blogsite/urls.py from django.contrib import admin from django.urls import path from myapp.views import MainView, PostJsonListView urlpatterns = [ path( 'admin/' , admin.site.urls), path(' ', MainView.as_view(), name=' main - view'), path( 'posts-json/<int:num_posts>/' , PostJsonListView.as_view(), name = 'posts-json-view' ), ] |