https://itcreator.tistory.com/129
이어서 하기
이전버전은 USER는 DB를 만들지 않아도 따로 생성되었음 (물론 커스터마이징 가능하지만 그건 나중에)
이번은 이전설정과 거의 비슷하게 한번 더 앱을 만들어 보고 게시판/댓글 DB 까지 다뤄보기
1. 기초설계
1. ctrl + shift + ~ 터미널 창 열어주기
2. board 앱 폴더 생성 및 등록
python manage.py startapp <app 이름>
mkdir -p <app 이름>/templates/<app 이름>
cd <app 이름>/templates/<app 이름>
touch detail.html form.html index.html
3. urls.py 및 forms.py 생성
Touch <app이름>/urls.py
Touch <app이름>/forms.py
2. board > urls.py 세팅해주기 (앱이름을 board 로 할 경우)
from django.urls import path
from . import views
app_name = 'board'
urlpatterns = [
path('create/', views.create_article, name='create_article'),
path('', views.article_index, name='article_index'),
path('<int:article_pk>/', views.article_detail, name='article_detail'),
path('<int:article_pk>/update/', views.update_article, name='update_article'),
path('<int:article_pk>/delete/', views.delete_article, name='delete_article'),
3. Model 단 (board > models.py)
from django.db import models
from django.conf import settings
class Article(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Comment(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
content = models.CharField(max_length=200)
article = models.ForeignKey(Article, on_delete=models.CASCADE)
Created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
3-1 . Form 단 (board > forms.py)
from django import forms
from .models import Article, Comment
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
exclude = ('user',)
class CommentForm(forms.ModelForm):
content = forms.CharField(min_length=2, max_length=200,
widget=forms.TextInput(attrs={'autofocus': True})
)
class Meta:
model = Comment
exclude = ('article', 'user')
model. form 끝냈으면 마이그레이트 시작
python manage.py makemigrations board
python manage.py migrate board
4. Control 단 (board > views.py)
1. 쉬운 버전용 필요한 클래스 import 하기
from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import (require_http_methods, require_POST, require_safe, )
from django.contrib.auth.decorators import login_required
from .models import Article, Comment
from .forms import ArticleForm, CommentForm
2. create_article 작성
@login_required
@require_http_methods(['GET', 'POST'])
def create_article(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save(commit=False)
article.user = request.user
article.save()
return redirect('board:article_detail', article.pk)
else:
form = ArticleForm()
context = {'form': form }
return render(request, 'board/form.html', context)
3. read
@require_safe
def article_index(request):
articles = Article.objects.all()
context = {'articles': articles, }
return render(request, 'board/index.html', context)
@require_safe
def article_detail(request, article_pk):
article = get_object_or_404(Article, pk=article_pk)
form = CommentForm()
context = {
'article': article,
'form': form
}
return render(request, 'board/detail.html', context)
4. update
@login_required
@require_http_methods(['GET', 'POST'])
def update_article(request, article_pk):
article = get_object_or_404(Article, pk=article_pk)
if request.user != article.user:
return redirect('board:article_detail', article.pk)
if request.method == 'POST':
form = ArticleForm(request.POST, instance=article)
if form.is_valid():
article = form.save()
return redirect('board:article_detail', article.pk)
else:
form = ArticleForm(instance=article)
context = {'form': form}
return render(request, 'board/form.html', context)
5. Delete
@login_required
@require_POST
def delete_article(request, article_pk):
article = get_object_or_404(Article, pk=article_pk)
if request.user == article.user:
article.delete()
return redirect('board:article_index')
else:
return redirect('board:article_detail', article.pk)
6. 댓글 (간단하게 CRD만)
@require_POST
def create_comment(request, article_pk):
form = CommentForm(request.POST)
article = get_object_or_404(Article, pk=article_pk)
if form.is_valid():
comment = form.save(commit=False)
comment.article = article
comment.user = article
comment.save()
return redirect('board:article_detail', article.pk)
@require_safe
def article_index(request):
articles = Article.objects.all() Article DB 값 받아서 articles에 넣어줌
context = {'articles': articles, }
return render(request, 'board/index.html', context)
@require_safe
def article_detail(request, article_pk):
article = get_object_or_404(Article, pk=article_pk)
form = CommentForm()
context = {
'article': article,
'form': form
}
return render(request, 'board/detail.html', context)
@login_required
@require_POST
def delete_comment(request, article_pk, comment_pk):
comment = get_object_or_404(Comment, pk=comment_pk)
article = get_object_or_404(Article, pk=article_pk)
if request.user == comment.user:
comment.delete()
return redirect('board:article_detail', article.pk)
총정리
@login_required
@require_http_methods(['GET', 'POST'])
def create_article(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save(commit=False)
article.user = request.user
article.save()
return redirect('board:article_detail', article.pk)
else:
form = ArticleForm()
context = {'form': form }
return render(request, 'board/form.html', context)
@login_required
@require_http_methods(['GET', 'POST'])
def update_article(request, article_pk):
article = get_object_or_404(Article, pk=article_pk)
if request.user != article.user:
return redirect('board:article_detail', article.pk)
if request.method == 'POST':
form = ArticleForm(request.POST, instance=article)
if form.is_valid():
article = form.save()
return redirect('board:article_detail', article.pk)
else:
form = ArticleForm(instance=article)
context = {'form': form}
return render(request, 'board/form.html', context)
@login_required
@require_POST
def delete_article(request, article_pk):
article = get_object_or_404(Article, pk=article_pk)
if request.user == article.user:
article.delete()
return redirect('board:article_index')
else:
return redirect('board:article_detail', article.pk)
@require_POST
def create_comment(request, article_pk):
form = CommentForm(request.POST)
article = get_object_or_404(Article, pk=article_pk)
if form.is_valid():
comment = form.save(commit=False)
comment.article = article
comment.user = article
comment.save()
return redirect('board:article_detail', article.pk)
@require_safe
def article_index(request):
articles = Article.objects.all()
context = {'articles': articles, }
return render(request, 'board/index.html', context)
@require_safe
def article_detail(request, article_pk):
article = get_object_or_404(Article, pk=article_pk)
form = CommentForm()
context = {
'article': article,
'form': form
}
return render(request, 'board/detail.html', context)
@login_required
@require_POST
def delete_comment(request, article_pk, comment_pk):
comment = get_object_or_404(Comment, pk=comment_pk)
article = get_object_or_404(Article, pk=article_pk)
if request.user == comment.user:
comment.delete()
return redirect('board:article_detail', article.pk)