Maximize Your Potential

BackEnd

[Python BootCamp] Django로 CRUD 구현 및 간단한 블로그 서비스 만들기

maxworld 2024. 8. 11. 13:46
728x90
반응형

[Python BootCamp] Django로 CRUD 구현 및 간단한 블로그 서비스 만들기

 

Django로 CRUD 구현

 

CRUD는 데이터베이스에서 기본적으로 수행되는 네 가지 핵심 작업(Create, Read, Update, Delete)의 약어입니다. 각 작업은 데이터의 생명 주기 관리에 필수적입니다. 백엔드 개발자의 가장 기본이라고 할 수 있는 CRUD를 장고로 어떻게 구현하는지 보여 드리도록 하겠습니다.

 

환경 설정

먼저, 필요한 패키지를 설치합니다.

pip install django


프로젝트 및 앱 생성

django-admin startproject myproject
cd myproject
python manage.py startapp blog

 

Model 정의 (models.py)

블로그 글에 필요한 모델을 생성합니다.

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)


Form 정의 (forms.py)

블로그 글을 생성하거나 수정하기 위한 폼을 생성합니다.

from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'content']


URL 설정 (urls.py)

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/new/', views.post_new, name='post_new'),
    path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
    path('post/<int:pk>/delete/', views.post_delete, name='post_delete'),
]


View 함수 생성 (views.py)

CRUD 기능을 위한 뷰 함수들을 생성합니다.

from django.shortcuts import render, get_object_or_404, redirect
from .models import Post
from .forms import PostForm

def post_list(request):
    posts = Post.objects.all()
    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_new(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_form.html', {'form': form})

def post_delete(request, pk):
    post = get_object_or_404(Post, pk=pk)
    post.delete()
    return redirect('post_list')


템플릿 생성
포스트 리스트, 상세보기, 폼 템플릿 등 필요한 템플릿을 생성합니다.


인증
Django에는 기본적인 사용자 인증 시스템이 내장되어 있습니다. django.contrib.auth 앱을 사용하면 로그인, 로그아웃, 비밀번호 변경 등의 기능을 쉽게 구현할 수 있습니다.

먼저 INSTALLED_APPS에 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions'를 포함시킵니다.

그 다음, urls.py에 인증 URL을 추가하고, 필요한 경우 뷰와 템플릿을 커스터마이징합니다.


이렇게  까지하면 웹의 CRUD 기능을 간단하게 구현할 수 있습니다. 추가적인 기능이나 더 깊은 내용은 Django의 공식 문서나 다양한 블로그 글들을 참고하시면 됩니다. 이렇게 연습을 해보시면, 어느정도 감을 잡히실 겁니다.

 

간단한 블로그 서비스 만들기

다음에는 장고를 통해 이미지를 넣고, 검색기능을 추가하여 블로그를 완성시켜 보도록 하겠습니다.

 

장고 프로젝트 및 앱 생성

django-admin startproject myblog
cd myblog
python manage.py startapp blog


모델 생성

blog/models.py에 모델을 정의합니다.

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    image = models.ImageField(upload_to='blog_images/', blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)


템플릿 작성

blog/templates 폴더를 생성합니다.
해당 폴더에 base.html을 생성하고 기본 레이아웃을 작성합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Blog</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>
blog_post.html 템플릿을 생성하여 게시물을 표시합니다.
html
Copy code
{% extends 'base.html' %}

{% block content %}
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
{% if post.image %}
    <img src="{{ post.image.url }}" alt="{{ post.title }}">
{% endif %}
{% endblock %}


데이터 저장 및 출력

먼저 모델 변경 사항을 반영합니다.

python manage.py makemigrations blog
python manage.py migrate



blog/views.py에 게시물을 가져와 템플릿에 전달하는 뷰를 추가합니다.

from django.shortcuts import render
from .models import Post

def post_detail(request, post_id):
    post = Post.objects.get(id=post_id)
    return render(request, 'blog_post.html', {'post': post})



myblog/urls.py에 URL 패턴을 추가합니다.

from django.urls import path
from blog.views import post_detail

urlpatterns = [
    path('post/<int:post_id>/', post_detail, name='post_detail'),
]



이미지 업로드 설정

myblog/settings.py에 이미지 업로드를 위한 설정을 추가합니다.

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')



myblog/urls.py에 미디어 파일 서비스를 위한 URL 패턴을 추가합니다.

from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)



웹 서비스의 검색 기능

blog/views.py에 게시물 검색 기능을 추가합니다.

 

def post_search(request):
    query = request.GET.get('q')
    posts = Post.objects.filter(title__icontains=query)
    return render(request, 'search_results.html', {'posts': posts})



검색 결과를 표시하는 search_results.html 템플릿을 생성합니다.

myblog/urls.py에 검색 URL 패턴을 추가합니다.

path('search/', post_search, name='post_search'),



이제 간단한 블로그 서비스가 완성되었습니다! python manage.py runserver를 실행하여 로컬에서 테스트 해볼 수 있습니다.