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를 실행하여 로컬에서 테스트 해볼 수 있습니다.
'BackEnd' 카테고리의 다른 글
[Python BootCamp] Python과 SQL을 이용한 데이터 관리 및 분석 튜토리얼 (2) | 2024.08.15 |
---|---|
[Python BootCamp] 장고의 다양한 특징들 및 웹 개발의 다양한 아키텍처와 패턴 (0) | 2024.08.12 |
[Python BootCamp]Django로 가상환경부터 간단한 웹사이트 구축하기 (0) | 2024.08.10 |
[Python BootCamp] 파이썬 클래스와 인스턴스, 클래스 메서드, 정적 메서드, 추상 클래스, 일급/고차함수 데코레이터, args, kwargs, 이터레이터 (0) | 2024.08.09 |
[Python BootCamp] 기본 연산자, 데이터 타입 조작, 내장 함수(Built-in Functions)와 집합(Set) 이해하기 (0) | 2024.08.08 |