Home / Tutorials Home
Django Blog App
Step 1: Create a Django Project
Let’s create a new Django project named “myblogproject”:
django-admin startproject myblogproject
cd myblogproject
Step 2: Create a Django App
Create a new Django app named “blog”:
python manage.py startapp blog
Step 3: Define Models
In “blog/models.py,” define the Post
model:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
Step 4: Create Database Tables
Run migrations to create the database tables for the Post
model:
python manage.py makemigrations
python manage.py migrate
Step 5: Create Views
In “blog/views.py,” create views for listing and displaying posts:
from django.shortcuts import render, get_object_or_404
from .models import Post
def post_list(request):
posts = Post.objects.order_by('-pub_date')
return render(request, 'blog/post_list.html', {'posts': posts})
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
Step 6: Create Templates
Create HTML templates in the “blog/templates/blog” directory. Create “post_list.html” for listing posts and “post_detail.html” for displaying a single post.
blog/templates/blog/post_list.html
:
{% extends 'base.html' %}
{% block content %}
<h1>Blog Posts</h1>
{% for post in posts %}
<h2><a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a></h2>
<p>{{ post.content }}</p>
<p>Published on: {{ post.pub_date }}</p>
{% empty %}
<p>No posts available.</p>
{% endfor %}
{% endblock %}
blog/templates/blog/post_detail.html
:
{% extends 'base.html' %}
{% block content %}
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
<p>Published on: {{ post.pub_date }}</p>
<a href="{% url 'post_list' %}">Back to posts</a>
{% endblock %}
Step 7: Create URL Configurations
In “blog/urls.py,” define URL patterns for the views:
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
path('post/<int:pk>/', views.post_detail, name='post_detail'),
]
Step 8: Configure the Main Project’s URL Configuration
In “myblogproject/urls.py,” include the app’s URL patterns:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
Step 9: Create a Form for Adding Posts (Optional)
You can create a form for adding new posts in “blog/forms.py”:
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
Step 10: Create Templates for Adding Posts (Optional)
If you want to create templates for adding posts, create “blog/templates/blog/post_form.html”:
{% extends 'base.html' %}
{% block content %}
<h1>Add a New Post</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
<a href="{% url 'post_list' %}">Back to posts</a>
{% endblock %}
Step 11: Update Views for Adding Posts (Optional)
In “blog/views.py,” create views for adding posts:
from django.shortcuts import render, get_object_or_404, redirect
from .models import Post
from .forms import PostForm
from django.db.models import Q # For search functionality
def post_list(request):
posts = Post.objects.order_by('-pub_date')
return render(request, 'blog/post_list.html', {'posts': posts})
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
def post_create(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
form.save()
return redirect('post_list')
else:
form = PostForm()
return render(request, 'blog/post_form.html', {'form': form})
def post_edit(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == 'POST':
form = PostForm(request.POST, instance=post)
if form.is_valid():
form.save()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm(instance=post)
return render(request, 'blog/post_edit.html', {'form': form, 'post': post})
def post_delete(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == 'POST':
post.delete()
return redirect('post_list')
return render(request, 'blog/post_confirm_delete.html', {'post': post})
def post_search(request):
query = request.GET.get('q', '')
posts = []
if query:
# Perform a case-insensitive search in title field
posts = Post.objects.filter(Q(title__icontains=query))
return render(request, 'blog/post_search.html', {'posts': posts})
Step 12: Update URL Configurations (Optional)
In “blog/urls.py,” add a URL pattern for adding posts:
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
path('post/<int:pk>/', views.post_detail, name='post_detail'),
path('post/create/', views.post_create, name='post_create'),
path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
path('post/<int:pk>/delete/', views.post_delete, name='post_delete'),
path('search/', views.post_search, name='post_search'),
]
To add edit, modify, delete, and search functionality to your Django blog app, you can extend the existing app by creating templates, views, and URL patterns for these actions. Below, I’ll provide instructions and templates for each of these features.
Step 1: Create Templates
Create templates for editing, modifying, deleting, and searching posts in the “blog/templates/blog” directory.
post_edit.html
blog/templates/blog/post_edit.html
:
{% extends 'base.html' %}
{% block content %}
<h1>Edit Post</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save Changes</button>
</form>
<a href="{% url 'post_detail' post.pk %}">Cancel</a>
{% endblock %}
post_confirm_delete.html
blog/templates/blog/post_confirm_delete.html
:
{% extends 'base.html' %}
{% block content %}
<h1>Delete Post</h1>
<p>Are you sure you want to delete "{{ post.title }}"?</p>
<form method="post">
{% csrf_token %}
<button type="submit">Confirm Delete</button>
</form>
<a href="{% url 'post_detail' post.pk %}">Cancel</a>
{% endblock %}
post_search.html
blog/templates/blog/post_search.html
:
{% extends 'base.html' %}
{% block content %}
<h1>Search Posts</h1>
<form method="get">
<input type="text" name="q" placeholder="Search by title">
<button type="submit">Search</button>
</form>
<a href="{% url 'post_list' %}">Back to posts</a>
<br><br>
{% if posts %}
<h2>Search Results</h2>
<ul>
{% for post in posts %}
<li><a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a></li>
{% empty %}
<li>No results found.</li>
{% endfor %}
</ul>
{% endif %}
{% endblock %}
Step 2: Update Views
In “blog/views.py,” add views for editing, modifying, deleting, and searching posts:
Step 3: Update URL Configurations
In “blog/urls.py,” add URL patterns for editing, modifying, deleting, and searching posts: