안녕하세요.
이번 시간에는 Django를 이용해서 게시판을 구현하는 실습을 진행하겠습니다.
Update, Delete 기능 - (Models, Forms, Views, Urls, Templates 구성)
0. Bootstrap 4 사전 준비
[Django] django-bootstrap4 부트스트랩 적용하기 (tistory.com)
실습을 진행하기 앞서 Bootstrap 4를 먼저 설치해 주세요.
1. Views.py 구성하기 - Update
def boardEdit(request, pk):
board = Board.objects.get(id=pk)
if request.method == "POST":
board.title = request.POST['title']
board.content = request.POST['content']
board.writer = request.POST['writer']
board.save()
return redirect('board')
else:
boardForm = BoardForm
return render(request, 'update.html', {'boardForm':boardForm})
위 코드는 board 앱의 게시글을 수정하는 기능을 담당하는 boardEdit 함수입니다.
(1) 먼저 Board 모델에서 id가 pk인 게시글을 가져와서 board 변수에 할당합니다.
(2) 이후 요청 메서드가 POST인 경우에는 요청으로부터 받은 제목(title), 내용(content), 작성자(writer) 정보를 board 객체의 해당 필드에 저장합니다.
(3) 마지막으로 board 객체를 저장하고, 게시판(board) 목록으로 이동합니다.
(4) 만약 요청 메서드가 GET인 경우에는 수정 폼을 보여주기 위해 BoardForm 인스턴스를 만들고, update.html 템플릿을 렌더링합니다. 이때 boardForm 변수를 템플릿 컨텍스트에 추가하여 폼을 렌더링할 때 사용합니다.
2. pk(primary key) 란?
pk란, 모델의 기본 키(primary key)를 나타내는 필드입니다.
모델의 각 인스턴스는 고유한 기본 키를 갖습니다. 이 기본 키는 모델의 생성자에 의해 자동으로 생성되거나, 수동으로 지정할 수 있습니다. 기본 키 필드는 일반적으로 id 또는 pk로 불리우며, AutoField 또는 IntegerField 등으로 정의됩니다.
Django에서는 기본 키를 사용하여 모델 인스턴스를 검색하고, 수정하고, 삭제하는 등의 작업을 수행합니다. 특히 URLconf에서 URL 패턴의 일부로 기본 키 값을 사용하여, 특정 모델 인스턴스를 나타내는 URL을 생성할 수 있습니다.
각 게시글마다 고유의 pk 값을 가지고 있고 게시글의 구분제로써 pk를 사용합니다. 저희가 만들어 줄 기능인 수정, 삭제에서는 pk 값을 사용합니다.
3. Urls.py 구성하기
from django.urls import path
from .views import *
urlpatterns = [
path('', board, name='board'),
path('edit/<int:pk>', boardEdit, name='edit'),
]
(1) path('edit/<int:pk>', boardEdit, name='edit')
edit/ 뒤에 정수형(pk) 데이터가 전달됐을 때 views.py 파일 내 boardEdit 함수를 실행하고, 이 URL 패턴의 이름을 edit으로 지정합니다. 이때 전달된 pk 값은 boardEdit 함수의 인자로 사용됩니다.
위의 URL 패턴은 'edit/<int:pk>' 문자열에 매칭됩니다. 이 패턴은 http://localhost:8000/edit/1과 같은 URL에 매칭됩니다. 여기서 <int:pk> 부분은 URL 패턴의 일부분으로, pk 변수를 정수형으로 받아들인다는 것을 나타냅니다. 이 패턴은 boardEdit 뷰 함수와 연결되어 있습니다. 이 패턴의 이름(name)은 'edit'로 지정되어 있습니다.
4. 게시판 수정 템플릿 구성하기
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<div class="container">
<form method="POST">
{% csrf_token %}
{% bootstrap_form boardForm %}
<input class="btn btn-dark rounded-pill col-12" type="submit" value="수정하기" onclick="location.href='/edit/{{board.pk}}/'">
</form>
</div>
{% endblock %}
views.py 파일에서 인스턴스로 넘겨주었던 board를 받아서 출력합니다.
5. 확인하기
다음과 같이 Form이 만들어지고 [수정하기] 버튼을 눌렀을 때 게시글이 수정되는 기능을 추가했습니다.
1. Views.py 구성하기 - Delete
def boardDelete(request, pk):
board = Board.objects.get(id=pk)
board.delete()
return redirect('board')
위 코드는 게시글을 삭제하는 view 함수입니다.
(1) URLconf에서 해당 view 함수를 호출하면, pk값을 인자로 받아와 해당 pk값에 해당하는 Board 객체를 데이터베이스에서 찾습니다.
(2) Board 객체의 delete() 메소드를 호출하여 해당 객체를 삭제합니다.
(3) redirect() 함수를 사용하여 삭제된 후에는 게시판 목록 페이지로 이동하도록 합니다.
2. Urls.py 구성하기
from django.urls import path
from .views import *
urlpatterns = [
path('', board, name='board'),
path('edit/<int:pk>', boardEdit, name='edit'),
path('delete/<int:pk>', boardDelete, name='delete'),
]
(1) path('delete/<int:pk>', boardDelete, name='delete')
delete/ 뒤에 정수형(pk) 데이터가 전달됐을 때 views.py 파일 내 boardDelete 함수를 실행하고, 이 URL 패턴의 이름을 delete로 지정합니다. 이때 전달된 pk 값은 boardDelete 함수의 인자로 사용됩니다.
3. 게시판 삭제 템플릿 구성하기
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
{% if board %}
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>내용</th>
<th>작성자</th>
<th>수정하기</th>
<th>삭제하기</th>
</tr>
</thead>
{% for board_list in board %}
<tbody>
<tr>
<td>{{ board_list.pk }}</td>
<td>{{ board_list.title }}</td>
<td>{{ board_list.content }}</td>
<td>{{ board_list.writer }}</td>
<td><button class="btn btn-secondary rounded-pill" onclick="location.href='/edit/{{board_list.pk}}'">수정</button></td>
<td><button class="btn btn-danger rounded-pill" onclick="location.href='/delete/{{board_list.pk}}'">삭제</button></td>
</tr>
</tbody>
{% endfor %}
</table>
{% endif %}
<div>
<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문을 통해 출력하고 각각의 버튼에 Update, Delete 기능을 추가했습니다.
4. 서버 실행하기
python manage.py runserver
5. 확인하기
pk가 2번인 게시글을 삭제하고 pk가 3인 게시글은 수정하고 pk가 2인 게시글은 삭제 해보도록 하겠습니다.
정상적으로 게시글이 pk가 2인 게시글은 삭제되고 pk가 3인 게시글은 수정이 된 모습입니다.
이렇게 게시글을 Create, Update, Delete하는 실습을 해봤습니다.
감사합니다.
'Framework > Django' 카테고리의 다른 글
[Django] Django 회원가입 구현하기(2) Login, Logout (0) | 2021.02.23 |
---|---|
[Django] Django 회원가입 구현하기(1) Sign Up, UserCreationForm (2) | 2021.02.23 |
[Django] Django 게시판 구현하기(1) Create (0) | 2021.02.08 |
[Django] Django-MySQL 연동하는 방법과 MySQL Workbench 사용 실습하기 (0) | 2021.02.08 |
[Django] Django ORM에 대해 알아보고 POST를 이용한 데이터베이스 저장하기 (0) | 2021.01.30 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!