How to Integrate Next.js with Django: A Step-by-Step Guide
By combining Next.js and Django, you can take use of both frameworks' strengths: Next.js provides a quick, server-rendered frontend, while Django offers a stable backend. In this tutorial, we'll create a basic book review application in which Next.js retrieves and presents book data that Django delivers over an API. After completing this tutorial, you will have a functional setup in which Next.js renders dynamic book reviews by using Django's API.

Introduction
By combining Next.js and Django, you can take use of both frameworks' strengths: Next.js provides a quick, server-rendered frontend, while Django offers a stable backend. In this tutorial, we'll create a basic book review application in which Next.js retrieves and presents book data that Django delivers over an API.
After completing this tutorial, you will have a functional setup in which Next.js renders dynamic book reviews by using Django's API.
Why Use Next.js with Django?
:white_check_mark: Fast Rendering: Next.js supports SSR (Server-Side Rendering) and SSG (Static Site Generation), improving performance.
:white_check_mark: Separation of Concerns: Business logic is handled by Django, and UI rendering is done by Next.js.
:white_check_mark: Scalability: Since each technology can grow on its own, future improvements will be simpler.
Step 1: Setting Up Django as the Backend
1. Install Django and Django REST Framework
Create a virtual environment and install dependencies:
# Create and activate a virtual environment
python -m venv venv
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # Windows
# Install Django and DRF
pip install django djangorestframework
2. Create a Django Project and App
django-admin startproject book_api
cd book_api
django-admin startapp reviews
3. Configure Django REST Framework
In settings.py, add REST framework and the reviews app:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'reviews',
]
4. Define the Book Review Model
In reviews/models.py:
from django.db import models
class BookReview(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
review = models.TextField()
rating = models.IntegerField()
def __str__(self):
return self.title
Run migrations:
python manage.py makemigrations
python manage.py migrate
5. Create a Serializer and API View
In reviews/serializers.py:
from rest_framework import serializers
from .models import BookReview
class BookReviewSerializer(serializers.ModelSerializer):
class Meta:
model = BookReview
fields = '__all__'
In reviews/views.py:
from rest_framework.generics import ListAPIView
from .models import BookReview
from .serializers import BookReviewSerializer
class BookReviewListView(ListAPIView):
queryset = BookReview.objects.all()
serializer_class = BookReviewSerializer
Add a URL route in reviews/urls.py:
from django.urls import path
from .views import BookReviewListView
urlpatterns = [
path('reviews/', BookReviewListView.as_view(), name='book-reviews'),
]
Include this in book_api/urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('reviews.urls')),
]
Run the server:
python manage.py runserver
You can now access book reviews at vercel.
--
Step 2: Setting Up Next.js as the Frontend
1. Install Next.js
In a new terminal, create a Next.js app:
npx create-next-app@latest book-review-frontend
cd book-review-frontend
npm install
2. Fetch Data from Django API
Modify pages/index.js to fetch book reviews:
import { useState, useEffect } from "react";
export default function Home() {
const [reviews, setReviews] = useState([]);
useEffect(() => {
fetch("http://127.0.0.1:8000/api/reviews/")
.then(response => response.json())
.then(data => setReviews(data));
}, []);
return (
<div>
<h1>Book Reviews</h1>
<ul>
{reviews.map(review => (
<li key={review.id}>
<h2>{review.title} by {review.author}</h2>
<p>{review.review}</p>
<strong>Rating: {review.rating}/5</strong>
</li>
))}
</ul>
</div>
);
}
3. Start the Next.js Server
Run:
npm run dev
Visit http://localhost:3000 to see book reviews fetched from Django!
Step 3: Connecting Frontend and Backend
Since Django and Next.js run on different ports (8000 and 3000), we need to handle CORS (Cross-Origin Resource Sharing).
1. Install Django CORS Headers
In Django, install CORS middleware:
pip install django-cors-headers
Add it to settings.py:
INSTALLED_APPS += ['corsheaders']
MIDDLEWARE.insert(1, 'corsheaders.middleware.CorsMiddleware')
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000",
]
Restart Django:
python manage.py runserver
Now, Next.js can fetch data without CORS issues!
Conclusion
You've created a book review app by successfully integrating Next.js with Django. What we did was as follows:
- Use the Django REST Framework to install Django.
- To offer book reviews, an API was developed.
- Created a frontend using Next.js to show reviews.
- Set up CORS to allow front-end and back-end communication.
This setup provides a solid foundation for full-stack development. You can now extend it with Django Authentication, a database, or advanced UI components!
Looking to deploy your full-stack application seamlessly? Check out Nife.io a powerful platform for serverless deployment, scaling, and cloud cost optimization! 🚀
Further Reading
From the team at Nife
Deploy your next app in minutes, not days.
Nife is a multi-cloud edge platform that lets you deploy, scale, and manage applications globally without the infrastructure headache.