「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > シンプルなブログアプリを作成する週間

シンプルなブログアプリを作成する週間

2024 年 7 月 29 日に公開
ブラウズ:340

Week  Creating Simple Blog App

導入

ChatGPT を使用せずに Django を使用してブログ アプリを構築する私の旅へようこそ。今週は、ブログ アプリを強化するための主要な機能の実装に焦点を当てました。ユーザーが投稿を作成したり、投稿にコメントしたり、他のユーザーの投稿に「いいね!」をしたりできる機能を追加しました。

私が行ったことの詳細な内訳は次のとおりです:

Django 投稿アプリを作成する

python manage.py startapp posts

ポストモデルの設計

私はポストモデルの設計から始めました。このモデルは、ユーザーが作成したブログ投稿を保存します:

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

コメントといいねのモデルを設計する

次に、ユーザーが投稿にコメントを残したり、「いいね!」を付けたりできるように、コメント モデルといいね!モデルも作成しました。

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}"

ビューの作成

テンプレートも付属しません。すべての投稿を作成、リストし、個々の投稿を表示するためのビューを作成しました:

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)

次は、投稿アプリで urls.py を作成します

from django.urls import path
from .views import *

app_name = "posts"

urlpatterns = [
    path("createpost/", create_post, name="create-post"),
    path("post//", postDetails, name="post-detail"),
    path("post//like/", like_post, name="like-post"),
    path("myposts/", myPosts, name="my-posts"),
]

課題と学習

今週、次のような課題に遭遇しました:

  • 「いいね!」ボタンを使用すると、ユーザーは投稿に 1 回だけ「いいね!」できるようになります。
  • 投稿の詳細ビュー内でコメントの送信フォームを作成します。

これらの課題にもかかわらず、私はユーザー インタラクションの処理や Django の ORM と連携してモデル間の関係を管理することについて多くのことを学びました。

これで私のシンプルなブログアプリが完成しました。アプリの詳細とライブデモについては、私の Github をチェックしてください。

来週の目標

スキルと知識を向上させるために、別の Django プロジェクトを作成する予定です。

Django プロジェクトで取り組むのに適したプロジェクトやコラボレーションについて何かアイデアがある場合は、お気軽にコメントを残してください。

私の旅に関するさらなる最新情報をお楽しみに!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/jjayfabor/week-2-creating-simple-blog-app-ie1?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3