Final Project - potatoscript/django GitHub Wiki
In this section, we’ll guide you through building a Mini Blog or Todo App using Django. This project will combine everything you've learned, such as setting up models, views, templates, forms, and implementing CRUD (Create, Read, Update, Delete) operations. By the end of this project, you’ll have a fully functional app that can store, update, delete, and display posts or tasks.
Open your terminal or command prompt, and navigate to your desired directory. Run the following commands to create a new Django project:
django-admin startproject mini_blog_project
cd mini_blog_project
Now, create a Django app within your project. Let’s call it blog
for the Mini Blog or todo
for the Todo app:
python manage.py startapp blog
If you’re building the Todo app, just replace the name blog
with todo
throughout the tutorial.
Next, go to the settings.py
file of your project (mini_blog_project/settings.py
) and add the app to the INSTALLED_APPS
list:
INSTALLED_APPS = [
# other apps
'blog', # or 'todo'
]
In the models.py
file of your app (blog/models.py
), define the models for the blog or todo tasks.
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=100)
description = models.TextField(blank=True)
completed = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
Once your models are defined, you need to create and apply migrations to create the corresponding tables in the database.
python manage.py makemigrations
python manage.py migrate
Now, let’s create views that will allow users to interact with the data.
In views.py
(blog/views.py
), define a view to display all posts or tasks:
from django.shortcuts import render
from .models import Post # or Task for Todo App
def post_list(request):
posts = Post.objects.all() # or Task.objects.all() for Todo
return render(request, 'blog/post_list.html', {'posts': posts})
For the Todo app, just replace Post
with Task
in the code above.
Add a view to handle the creation of new posts or tasks:
from django.shortcuts import render, redirect
from .models import Post # or Task for Todo App
from .forms import PostForm # or TaskForm for Todo App
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})
For the Todo app, just replace Post
with Task
and adjust accordingly.
Create a view to edit existing posts or tasks:
from django.shortcuts import render, get_object_or_404, redirect
from .models import Post # or Task for Todo App
from .forms import PostForm # or TaskForm for Todo App
def post_edit(request, pk):
post = get_object_or_404(Post, pk=pk) # or Task for Todo App
if request.method == "POST":
form = PostForm(request.POST, instance=post) # or TaskForm for Todo App
if form.is_valid():
form.save()
return redirect('post_list')
else:
form = PostForm(instance=post) # or TaskForm for Todo App
return render(request, 'blog/post_form.html', {'form': form})
Create a view to delete posts or tasks:
from django.shortcuts import get_object_or_404, redirect
from .models import Post # or Task for Todo App
def post_delete(request, pk):
post = get_object_or_404(Post, pk=pk) # or Task for Todo App
post.delete()
return redirect('post_list')
We’ll now create forms to handle the data input.
In forms.py
(blog/forms.py
), create a form for the Post model:
from django import forms
from .models import Post # or Task for Todo App
class PostForm(forms.ModelForm):
class Meta:
model = Post # or Task for Todo App
fields = ['title', 'content'] # or ['title', 'description'] for Todo
You need to wire everything together by setting up URLs for your views.
In urls.py
(blog/urls.py
), define the URL patterns:
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'), # or task_list for Todo App
path('post/new/', views.post_create, name='post_create'), # or task_create for Todo App
path('post/<int:pk>/edit/', views.post_edit, name='post_edit'), # or task_edit for Todo App
path('post/<int:pk>/delete/', views.post_delete, name='post_delete'), # or task_delete for Todo App
]
In mini_blog_project/urls.py
, include the blog
app URLs:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')), # or todo.urls for Todo App
]
Now, let’s create the HTML templates for listing, creating, and editing posts.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Blog</title>
</head>
<body>
<h1>Blog Posts</h1>
<a href="{% url 'post_create' %}">Create a new post</a>
<ul>
{% for post in posts %}
<li>
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
<a href="{% url 'post_edit' post.pk %}">Edit</a>
<a href="{% url 'post_delete' post.pk %}">Delete</a>
</li>
{% endfor %}
</ul>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Create/Edit Post</title>
</head>
<body>
<h1>{% if form.instance.pk %}Edit{% else %}Create{% endif %} Post</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">{% if form.instance.pk %}Save Changes{% else %}Create Post{% endif %}</button>
</form>
</body>
</html>
Finally, run the server and check out your app!
python manage.py runserver
Go to http://127.0.0.1:8000/
in your browser to see your Mini Blog or Todo App in action!