본문 바로가기

Python/실습

[django 연습] Diary / 일기장 / CRUD 구현

Diary 웹사이트 만들기

  • 제목-내용 형태로 일기를 올릴 수 있다.
  • 오늘의 날짜와 시간으로 자동으로 글이 올려진다.
  • 수정/삭제가 가능하다.

https://github.com/JisunParkRea/django_diary

 

JisunParkRea/django_diary

Making CRUD Diary board using Django. Contribute to JisunParkRea/django_diary development by creating an account on GitHub.

github.com

 

페이지 정리

  • 제목+날짜+(수정, 삭제)이 나열되어있는 페이지
  • 그 중 한 제목 클릭 -> 제목+내용을 보여주는 페이지
  • 내용을 수정할 수 있는 페이지

 

가상환경 및 기본 설정

  • python -m venv myvenv
  • myvenv\Scripts\activate
  • pip install django
  • django-admin startproject diarySite
  • cd diarySite
  • python manage.py startapp posts
  • 새로운 app 'posts' 등록하기
# diarySite\settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'posts', # 새로운 app 등록
]

#...
LANGUAGE_CODE = 'ko' # 언어

TIME_ZONE = 'Asia/Seoul' # 한국 시간

 

  • diarySite\urls.py에 post url 등록하기
# diarySite\urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('posts/', include('posts.urls')), # diarySite\posts\urls.py를 만들고 url을 등록할거기에
]

 

Models 정의

# diarySite\posts\models.py

import datetime

from django.db import models
from django.utils import timezone

class Post(models.Model):
    title_text = models.CharField(max_length=100) # 제목
    content_text = models.CharField(max_length=1000) # 내용
    pub_date = models.DateTimeField(auto_now_add=True) # 자동으로 오늘 날짜로 설정됨
    
    def __str__(self):
        return self.title_text
  • python manage.py makemigrations posts
  • python manage.py migrate

 

Admin 구축

  • python manage.py createsuperuser

# diarySite\posts\admin.py

from django.contrib import admin
from .models import Post

admin.site.register(Post)

 

Url 설정

  • diarySite\posts\urls.py 파일 만들기
#diarySite\posts\urls.py

from django.urls import path

from . import views

# app_name = 'posts'
urlpatterns = [
    # ex: /posts/
    path('', views.index, name='index'),
    # ex: /posts/create
    path('create/', views.create, name='create'),
    # ex: /posts/5/ 
    path('<int:post_id>/', views.detail, name='detail'),
    # ex: /posts/5/update
    path('<int:post_id>/update', views.update, name='update'),
    # ex: /posts/5/delete
    path('<int:post_id>/delete', views.delete, name='delete'),
]

 

Form 만들기

  • ModelForm을 사용하면 Model에서 정의한대로 Form을 사용할 수 있음
  • posts\forms.py 파일을 만들기
# diarySite\posts\forms.py

from django import forms
from .models import Post

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

 

View 만들기

# diarySite\views.py

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

# 제목 리스트
def index(request):
    post_list = Post.objects.all()
    context = {'post_list': post_list}
    return render(request, 'posts/index.html', context)

# 내용 상세 페이지
def detail(request, post_id):
    post = get_object_or_404(Post, pk=post_id)
    return render(request, 'posts/detail.html', {'post': post})

# 새로운 글 등록
def create(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('index')
        
    else:
        form = PostForm()
    return render(request, 'posts/create.html', {'form': form})

# 글 수정
def update(request, post_id):
    post = get_object_or_404(Post, pk=post_id)

    if request.method == 'POST':
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            form.save()
            return redirect('detail', post_id)
        
    else:
        form = PostForm(instance=post)
    return render(request, 'posts/update.html', {'form': form})

# 글 삭제
def delete(request, post_id):
    post = Post.objects.get(pk=post_id)
    post.delete()
    return redirect('index')

 

Template 만들기

  • diarySite\posts\templates\posts디렉토리를 만들고 그 안에 html 파일들을 만들자.

# diarySite\posts\templates\posts\index.html

<h1><a href="{% url 'index' %}">Jisun's Diary</a></h1>
<a href="{% url 'create' %}">새글쓰기</a>
{% if post_list %}
    <ul>
    {% for post in post_list %}
        <li><a href="{% url 'detail' post.id %}">{{ post.title_text }}</a>&nbsp;&nbsp;&nbsp;
            {{ post.pub_date }}&nbsp;&nbsp;
            <a href="{% url 'update' post.id %}">수정</a>&nbsp;&nbsp;
            <a href="{% url 'delete' post.id %}">삭제</a>
        </li>
        <br>
    {% endfor %}
    </ul>
{% else %}
    <p>No posts are available.</p>
{% endif %}
# diarySite\posts\templates\posts\detail.html

<h1><a href="{% url 'index' %}">Jisun's Diary</a></h1>
<h2>{{ post.title_text }}</h2>
<h5>{{ post.pub_date }}</h5>
{{ post.content_text }}
# diarySite\posts\templates\posts\create.html

<h1>Jisun's Diary</h1>
<h2>새 글쓰기</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <br>
    <input type="submit" value="등록하기">
</form>
# diarySite\posts\templates\posts\update.html

<h1>Jisun's Diary</h1>
<h2>수정하기</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <br>
    <input type="submit" value="등록하기">
</form>

 

완성!

/posts/
/posts/1/
posts/create/
posts/1/update/

 

 

참고

https://tothefullest08.github.io/django/2019/05/11/Django14_CRUD_Bootstrap/

 

Django 14 - CRUD 구현 및 Django에 Bootstrap 입히기 · 해리의 데브로그

 

tothefullest08.github.io

https://medium.com/@asaprocky123/crud-%EB%85%B8%ED%8A%B8-%EC%93%B0%EB%8A%94%EC%A4%91-44c3eb1420db

 

Django — CRUD 기능 구현

쌩 Django로 기본 CRUD 기능 구현하기

medium.com

 

끝!