Diary 웹사이트 만들기
- 제목-내용 형태로 일기를 올릴 수 있다.
- 오늘의 날짜와 시간으로 자동으로 글이 올려진다.
- 수정/삭제가 가능하다.
https://github.com/JisunParkRea/django_diary
페이지 정리
- 제목+날짜+(수정, 삭제)이 나열되어있는 페이지
- 그 중 한 제목 클릭 -> 제목+내용을 보여주는 페이지
- 내용을 수정할 수 있는 페이지
가상환경 및 기본 설정
- 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>
{{ post.pub_date }}
<a href="{% url 'update' post.id %}">수정</a>
<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>
완성!
참고
https://tothefullest08.github.io/django/2019/05/11/Django14_CRUD_Bootstrap/
https://medium.com/@asaprocky123/crud-%EB%85%B8%ED%8A%B8-%EC%93%B0%EB%8A%94%EC%A4%91-44c3eb1420db
끝!
'Python > 실습' 카테고리의 다른 글
[웹크롤링: bs4, requests] 네이버 날씨 미세먼지 가져오기 / 네이버 웹툰 제목 가져오기 / 네이버 웹툰 썸네일 가져오기 (0) | 2020.03.28 |
---|---|
[django 연습] 나의 첫 번째 Django 프로젝트 / Django Girls(장고 걸스) Tutorial (0) | 2020.03.21 |
[파이썬으로 영화 예매 오픈 알리미 만들기] 3. 스케쥴러 (0) | 2020.02.25 |
[파이썬으로 영화 예매 오픈 알리미 만들기] 2. 텔레그램 봇 (0) | 2020.02.24 |
[파이썬으로 영화 예매 오픈 알리미 만들기] 1. 웹 크롤링 (1) | 2020.02.18 |