ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [4월 4주차-4/22]📝 Django로 블로그 만들기 – 글/댓글/썸네일까지
    Why Not SW CAMP 5기/수업 기록 2025. 4. 22. 14:15

     

    오늘은 Django를 활용해 간단한 블로그 웹사이트를 만드는 방법을 배웠습니다. 글과 댓글을 작성하고, 썸네일 이미지까지 등록할 수 있는 기능을 구현했어요. 하나씩 단계별로 정리해볼게요!


    1️⃣ Django 프로젝트 시작

    📦 가상환경에서 Django 설치

    pip install 'django<5'
    

    ※ Django 5는 아직 일부 패키지와 호환되지 않기 때문에 <5로 설치합니다.

    🛠 새 프로젝트 생성

    django-admin startproject config .
    

    현재 디렉토리에 config라는 이름으로 프로젝트가 생성됩니다.


    2️⃣ 템플릿 설정

    settings.py에서 템플릿 경로를 명시해줍니다.

    TEMPLATES_DIR = BASE_DIR / "templates"
    
    TEMPLATES = [
        {
            ...
            'DIRS': [TEMPLATES_DIR],
            ...
        },
    ]
    

    3️⃣ 블로그 앱 생성

    python manage.py startapp blog
    

    그리고 settings.py의 INSTALLED_APPS에 "blog" 추가하는 것도 잊지 마세요.


    4️⃣ 모델 작성: 글과 댓글

    blog/models.py

    from django.db import models
    
    class Post(models.Model):
        title = models.CharField("포스트 제목", max_length=100)
        content = models.TextField("포스트 내용")
        thumbnail = models.ImageField("썸네일 이미지", upload_to="post", blank=True)
    
        def __str__(self):
            return self.title
    
    class Comment(models.Model):
        post = models.ForeignKey(Post, on_delete=models.CASCADE)
        content = models.TextField("댓글 내용")
    
        def __str__(self):
            return f"{self.post.title}의 댓글 (ID: {self.id})"
    

    💾 마이그레이션

    python manage.py makemigrations
    python manage.py migrate
    

    5️⃣ 관리자 페이지 설정

    관리자 페이지에서 글과 댓글을 관리할 수 있도록 등록합니다.

    blog/admin.py

    from django.contrib import admin
    from blog.models import Post, Comment
    
    @admin.register(Post)
    class PostAdmin(admin.ModelAdmin):
        pass
    
    @admin.register(Comment)
    class CommentAdmin(admin.ModelAdmin):
        pass
    

    👤 슈퍼유저 생성

    python manage.py createsuperuser
    

    6️⃣ 이미지 처리 준비

    글에 이미지(썸네일)를 업로드하려면 Pillow 패키지가 필요합니다.

    pip install 'Pillow<10'
    

    7️⃣ 뷰 구현 (글 목록, 상세, 작성)

    blog/views.py

    from django.shortcuts import render, redirect
    from blog.models import Post, Comment
    
    def post_list(request):
        posts = Post.objects.all()
        return render(request, "post_list.html", {"posts": posts})
    
    def post_detail(request, post_id):
        post = Post.objects.get(id=post_id)
        if request.method == "POST":
            comment_content = request.POST["comment"]
            Comment.objects.create(post=post, content=comment_content)
        return render(request, "post_detail.html", {"post": post})
    
    def post_add(request):
        if request.method == "POST":
            title = request.POST["title"]
            content = request.POST["content"]
            thumbnail = request.FILES["thumbnail"]
            post = Post.objects.create(title=title, content=content, thumbnail=thumbnail)
            return redirect(f"/posts/{post.id}/")
        return render(request, "post_add.html")
    

    8️⃣ URL 연결

    config/urls.py

    from django.conf import settings
    from django.conf.urls.static import static
    from django.contrib import admin
    from django.urls import path
    from blog.views import post_list, post_detail, post_add
    from config.views import index
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path("", index),
        path("posts/", post_list),
        path("posts/<int:post_id>/", post_detail),
        path("posts/add/", post_add),
    ]
    
    urlpatterns += static(
        prefix=settings.MEDIA_URL,
        document_root=settings.MEDIA_ROOT,
    )
    

    ※ MEDIA_URL, MEDIA_ROOT는 settings.py에 아래처럼 설정해두어야 합니다:

    MEDIA_URL = "/media/"
    MEDIA_ROOT = BASE_DIR / "media"
    

    ✅ 마무리

    이렇게 해서 완성된 기능은 다음과 같습니다:

    • 블로그 글 목록 조회
    • 글 작성 (썸네일 이미지 포함)
    • 글 상세 조회 및 댓글 작성
    • Django Admin 페이지에서 글/댓글 관리

Designed by Tistory.