Jaylord Vhan Fabor
Posted on July 26, 2024
Introduction
Welcome back to my journey of building a blog app using Django without using ChatGPT. This week, I focused on implementing key features to enhance my blog app. I added a functionality that allow users to create posts, comment on posts, and like other user's posts.
Here's a detailed breakdown of what I did:
Create Django posts
app
python manage.py startapp posts
Designing the Post Model
I started by designing the Post
model. This model will store the blog posts created by users:
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Post(models.Model):
title = models.CharField(max_length=100)
description = models.CharField(max_length=200, help_text="Excerpt of the post...")
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
publication_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
Designing the Comment and Like Model
Next, I created as well the Comment
and Like
models to allow users to leave comment and like on posts:
class Comment(models.Model):
post = models.ForeignKey(Post, related_name="comments", on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return f"Comment by {self.author} on {self.post}"
class Like(models.Model):
post = models.ForeignKey(Post, related_name="likes", on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return f"Like by {self.user} on {self.post}"
Creating Views
I will not include the templates as well. I created views for creating, listing all posts and displaying individual posts:
from django.shortcuts import render, redirect, get_object_or_404
from rest_framework import generics
from django.contrib.auth.decorators import login_required
from .serializer import PostSerializer
from .forms import *
from .models import *
def create_post(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
newPost = form.save(commit=False)
newPost.author = request.user
newPost.save()
return redirect("posts:my-posts")
else:
form = PostForm()
return render(request, "create_post.html", {"form": form, "show_header": True})
@login_required
def myPosts(request):
'''
List the user created posts
'''
posts = Post.objects.filter(author=request.user)
return render(request, "posts_list.html", {"posts": posts, "show_header": True})
def postDetails(request, pk):
'''
List all posts in the dashboard and display the comments and likes
'''
post = get_object_or_404(Post, pk=pk)
comment = post.comments.all()
likes = post.likes.count()
user_has_liked = post.likes.filter(user=request.user).exists()
if request.method == "POST":
comment_form = CommentForm(request.POST)
if comment_form.is_valid():
comment = comment_form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
return redirect("posts:post-detail", pk=post.pk)
else:
comment_form = CommentForm()
return render(
request,
"main_post.html",
{
"post": post,
"comments": comment,
"comment_form": comment_form,
"likes": likes,
"user_has_liked": user_has_liked,
},
)
@login_required
def like_post(request, pk):
'''
Handle liking posts
'''
post = get_object_or_404(Post, pk=pk)
like, created = Like.objects.get_or_create(post=post, user=request.user)
if not created:
like.delete()
return redirect("posts:post-detail", pk=post.pk)
Next is the creating urls.py
in a posts
app
from django.urls import path
from .views import *
app_name = "posts"
urlpatterns = [
path("createpost/", create_post, name="create-post"),
path("post/<int:pk>/", postDetails, name="post-detail"),
path("post/<int:pk>/like/", like_post, name="like-post"),
path("myposts/", myPosts, name="my-posts"),
]
Challenges and Learnings
This week, I encountered challenges with:
- Ensuring the like button allow users to like a post once.
- Creating form submissions for comments within the post detail view.
Despite these challenges, I learned a lot about handling user interactions and working with Django’s ORM to manage relationships between models.
And that makes my Simple Blog App. Check my Github for more details and a live demo of the app.
Next Week's Goals
I plan to create another Django project to improve my skills and knowledge.
If you have any idea what is a good project to work on or a collaboration on a Django project, please feel free to leave a comment.
Stay tuned for more updates on my journey!
Posted on July 26, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 20, 2024