안녕하세요.
이번 시간에는 Django를 이용해서 게시판을 구현하는 실습을 진행하겠습니다.
Create 기능 - (Models, Forms, Views, Urls, Templates 구성)
0. Bootstrap 4 사전 준비
[Django] django-bootstrap4 부트스트랩 적용하기 (tistory.com)
실습을 진행하기 앞서 Bootstrap 4를 먼저 설치해 주세요.
1. Models.py 구성하기
from django.db import models
# Create your models here.
class Board(models.Model):
title = models.CharField(max_length=20, null=True)
content = models.TextField()
writer = models.CharField(max_length=20, null=True)
(1) Board 클래스는 models.Model 클래스를 상속받습니다.
(2) 클래스 변수인 title, content, writer는 게시판의 제목, 내용, 작성자를 나타냅니다.
(3) title은 CharField로 최대 길이가 20인 문자열을 저장할 수 있습니다.
(4) content는 TextField로 긴 문자열을 저장할 수 있습니다.
(5) writer는 CharField로 최대 길이가 20인 문자열을 저장할 수 있습니다.
(6) null=True로 설정되어 있어, title과 writer는 null 값을 가질 수 있습니다.
이렇게 정의된 모델은 Django ORM을 통해 데이터베이스에 반영될 수 있습니다. 예를 들어 Board.objects.create(title='제목', content='내용', writer='작성자')와 같은 코드를 실행하면 새로운 게시물이 생성되고 데이터베이스에 저장됩니다.
2. Forms.py 구성하기
from django.forms import ModelForm
from .models import *
class BoardForm(ModelForm):
class Meta:
model = Board
fields = ['title', 'content', 'writer']
(1) BoardForm 클래스는 ModelForm 클래스를 상속받습니다.
(2) ModelForm 클래스는 모델(Model)과 연관된 폼을 생성하는 데 사용됩니다.
(3) 클래스 변수인 Meta는 폼에 대한 설정을 담고 있습니다.
(4) model = Board은 이 폼이 사용할 모델을 Board 모델로 지정합니다.
(5) fields = ['title', 'content', 'writer']는 이 폼에서 사용할 필드를 지정합니다. 즉, 사용자가 입력할 수 있는 필드는 title, content, writer입니다.
이렇게 정의된 폼은 Django의 View에서 사용될 수 있습니다. 예를 들어, BoardForm(request.POST)와 같은 코드를 실행하면 사용자가 입력한 데이터를 받아와서 Board 모델에 저장할 수 있습니다. 또는 이 폼을 HTML 템플릿에서 렌더링하여 사용자에게 보여줄 수도 있습니다.
3. Views.py 구성하기
from django.shortcuts import render, redirect
from .forms import *
from .models import *
def board(request):
if request.method == 'POST':
title = request.POST['title']
content = request.POST['content']
writer = request.POST['writer']
board = Board(
title=title,
content=content,
writer=writer,
)
board.save()
return redirect('board')
else:
boardForm = BoardForm
board = Board.objects.all()
context = {
'boardForm': boardForm,
'board': board,
}
return render(request, 'board.html', context)
(1) request.method가 'POST'일 경우, 사용자가 입력한 데이터를 받아와서 Board 모델에 저장합니다.
(2) 그 후, 게시판 페이지(board)로 redirect합니다.
(3) request.method가 'GET'일 경우, BoardForm과 모든 게시물(Board)을 가져와서 HTML 템플릿(board.html)에 렌더링합니다.
세부 설명
(1) board(request)
이 함수는 HTTP 요청을 처리하고 HTTP 응답을 반환합니다. request는 Django에서 제공하는 HttpRequest 객체입니다.
(2) request.method
요청 방식(GET 또는 POST)을 나타냅니다.
(3) if request.method == 'POST'
HTTP POST 요청이면, 사용자가 입력한 데이터(title, content, writer)를 받아와서 Board 모델의 새로운 인스턴스를 생성합니다.
(4) request.POST
POST 요청으로 전송된 데이터를 나타내는 사전형(QueryDict) 객체입니다. 이 객체는 request.body에서 가져온 데이터를 분석하고 파싱합니다.
(5) request.POST['title']
POST 요청으로 전송된 데이터 중에서 'title'이라는 이름의 데이터를 가져옵니다.
(6) Board(title=title, content=content, writer=writer)
Board 모델의 새로운 인스턴스를 생성합니다. 이때, 사용자가 입력한 데이터를 이용하여 생성합니다.
(7) board.save()
Board 모델의 인스턴스를 데이터베이스에 저장합니다.
(8) return redirect('board')
게시판 페이지(board)로 redirect합니다.
(9) else
HTTP GET 요청이면, BoardForm과 모든 게시물(Board)을 가져와서 HTML 템플릿(board.html)에 렌더링합니다.
(10) BoardForm
Board 모델을 사용하는 폼입니다. 이 폼은 사용자로부터 입력을 받고, 검증하고, 데이터를 저장합니다.
(11) boardForm = BoardForm
BoardForm 클래스의 인스턴스를 생성합니다.
(12) Board.objects.all()
Board 모델의 모든 인스턴스를 가져옵니다.
(13) context
템플릿에 전달될 데이터를 포함하는 사전형(Dictionary) 객체입니다. 이 객체는 {'키': '값'} 형식으로 구성됩니다.
4. Urls.py 구성하기
from django.urls import path
from .views import *
urlpatterns = [
path('', board, name='board'),
]
(1) from django.urls import path
Django에서 제공하는 URL 패턴을 관리하는 함수 path를 가져옵니다.
(2) from .views import *
현재 패키지(.)에서 views.py 파일을 가져와서 모든 함수와 클래스를 import합니다.
(3) urlpatterns
URL 패턴들의 목록을 나타내는 리스트입니다. 이 리스트는 Django에 의해 자동으로 검색됩니다.
(4) path('', board, name='board')
'/'(루트) 경로로 들어왔을 때, board 함수를 실행하도록 지정합니다. 이때, name 인자를 사용하여 URL 패턴의 이름을 'board'로 지정합니다.
세부 설명
(1) path('', board, name='board')
URL 패턴을 나타내는 함수입니다.
(2) path
URL 패턴을 나타내는 함수입니다. 첫 번째 인자는 URL 패턴을 나타내는 문자열이며, 두 번째 인자는 URL 패턴이 매칭될 때 호출될 함수를 나타냅니다.
(3) ' '
URL 패턴을 나타내는 문자열입니다. 이 경우, 루트 경로를 나타냅니다.
(4) board
URL 패턴이 매칭될 때 호출될 함수입니다. 이 함수는 views.py 파일에서 가져온 board 함수입니다.
(5) name='board'
URL 패턴의 이름을 'board'로 지정합니다. 이렇게 이름을 지정하면, URL 패턴을 참조할 때 이름을 사용할 수 있습니다. 예를 들어, redirect('board')와 같이 사용할 수 있습니다.
5. 게시판 템플릿 구현
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
{% if board %}
<table class="table table-bordered text-center">
<thead>
<tr>
<th scope="col">번호</th>
<th scope="col">제목</th>
<th scope="col">내용</th>
<th scope="col">작성자</th>
</tr>
</thead>
<tbody>
{% for board_list in board %}
<tr>
<td>{{ board_list.pk }}</td>
<td>{{ board_list.title }}</td>
<td>{{ board_list.content }}</td>
<td>{{ board_list.writer }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<div class="container mt-4">
<form action="" method="POST">
{% csrf_token %}
{% bootstrap_form boardForm %}
<button type="submit" class="btn btn-primary rounded-pill col-12">POST</button>
</form>
</div>
{% endblock %}
views.py 파일에서 인스턴스로 넘겨주었던 board를 받아서 for 문을 돌려 객체 안의 내용을 출력합니다.
6. 서버 실행하기
python manage.py runserver
아직 회원가입 기능을 만들어주지 않아서 writer를 직접 입력해 주어야 하지만 회원가입을 만들어서 User 정보를 받아 Writer를 자동으로 만들어줄 수 있습니다. POST 버튼을 눌렀을 때 게시글이 생성되는 간단한 실습을 진행했습니다.
이번 시간에는 Django 프레임워크를 통해 게시판의 기초가 되는 Models, Forms, Views, Urls, 템플릿을 구성하고 코드를 분석하는 실습을 진행했습니다.
감사합니다.
'Framework > Django' 카테고리의 다른 글
[Django] Django 회원가입 구현하기(1) Sign Up, UserCreationForm (2) | 2021.02.23 |
---|---|
[Django] Django 게시판 구현하기(2) Update, Delete (0) | 2021.02.08 |
[Django] Django-MySQL 연동하는 방법과 MySQL Workbench 사용 실습하기 (0) | 2021.02.08 |
[Django] Django ORM에 대해 알아보고 POST를 이용한 데이터베이스 저장하기 (0) | 2021.01.30 |
[Django] Django에서 GET, POST 방식에 대해 알아보고 간단한 실습하기 (0) | 2021.01.30 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!