React + Django + Ninja (Full-stack in 15 mins) ⚛️🥷
Published: July 10, 2024
We'll create a full-stack web app using:
- Django as the backend (using the neat Django Ninja library)
- React as the frontend (using TypeScript)
Our aim: create an app that displays a list of trees fetched from a Django API. Very quickly.
Here's a video guide of me building this 🙂:
Part 1: Setting up the Django Backend
Step 1: Create a Django Project
- Open a terminal and create a new directory for your project:
mkdir django-react-appcd django-react-app
- Create a virtual environment and activate it:
python -m venv venvsource venv/bin/activate # On Windows, use `venv\Scripts\activate`
- Install Django:
pip install django django-cors-headers django-ninja
- Create a new Django project:
django-admin startproject core .
- Create a new Django app:
python manage.py startapp sim
Step 2: Configure the Django Project
- Open
core/settings.py
and add 'sim' to theINSTALLED_APPS
list:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','sim', # Add this line]
- In the same file, add CORS settings to allow requests from your React app:
INSTALLED_APPS = [# ... other apps ...'corsheaders', # Add this line'sim',]MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware', # Add this line# ... other middleware ...]CORS_ALLOWED_ORIGINS = ["http://localhost:5173", # Add this line (Vite's default port)]
Step 3: Create the Tree Model
- Open
sim/models.py
and add the following code:
from django.db import modelsclass Tree(models.Model):name = models.CharField(max_length=255)def __str__(self):return self.name
- Create and apply migrations:
python manage.py makemigrationspython manage.py migrate
Step 4: Create the API
- Create a new file
sim/api.py
and add the following code:
from ninja import NinjaAPIfrom .models import Treeapi = NinjaAPI()@api.get("/trees")def list_trees(request):trees = Tree.objects.all()return [{"id": tree.id, "name": tree.name} for tree in trees]
- Update
sim/urls.py
to include the API:
from django.urls import pathfrom .api import apiurlpatterns = [path('api/', api.urls),]
- Update
core/urls.py
to include the sim app's URLs:
from django.contrib import adminfrom django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('sim.urls')),]
Step 5: Add Some Data
- Open the Django shell to add some trees:
python manage.py shell
Then:
from sim.models import TreeTree.objects.create(name="Oak")Tree.objects.create(name="Pine")Tree.objects.create(name="Maple")Tree.objects.create(name="Birch")Tree.objects.create(name="Willow")
- Run the development server:
python manage.py runserver
- Test the API by visiting
http://localhost:8000/api/trees
. You should see a JSON response with the trees you added.
Part 2: Setting up the React Frontend
Step 1: Create a Vite React Project
- In a new terminal (keep the Django server running), navigate to your project directory and create a new Vite project:
npm create vite@latest vite-project -- --template react-tscd vite-projectnpm install
Step 2: Update the React App
- Replace the contents of
src/App.tsx
with the following:
import { useEffect, useState } from 'react'function App() {interface Tree {id: numbername: string}const [trees, setTrees] = useState<Tree[]>([])const fetchTrees = async () => {const response = await fetch('http://localhost:8000/api/trees')const data = await response.json()setTrees(data)}useEffect(() => {fetchTrees()}, [])return (<><div>List of trees</div>{trees.map((tree: Tree) => (<div key={tree.id}>{tree.name}</div>))}</>)}export default App
Step 3: Run the React App
- Start the development server:
npm run dev
- Open
http://localhost:5173
in your browser. You should see the list of trees you added in the Django admin.
Testing and Troubleshooting
-
Django API:
- Ensure your Django server is running (
python manage.py runserver
). - Visit
http://localhost:8000/api/trees
to verify the API is working. - If you don't see any trees, make sure you've added some through the Django shell.
- Ensure your Django server is running (
-
React App:
- Check the browser console for any errors.
- If you see a CORS error, make sure you've properly configured CORS in your Django settings.
- Verify that the fetch URL in
App.tsx
matches your Django server's address and port.
-
Data Flow:
- Use browser developer tools to inspect the network requests.
- Verify that the request to
/api/trees
is being made and returning the expected data.
-
Component Rendering:
- Use React Developer Tools to inspect the component state and ensure the
trees
state is being updated correctly.
- Use React Developer Tools to inspect the component state and ensure the
Remember to test your application thoroughly at each step. If you encounter any issues, double-check your code against the provided examples and ensure all necessary dependencies are installed.
Conclusion
You've now created a basic Django and React application that fetches and displays data from an API!