-
[Django] 게시판 CRUD 구현하기웹 Web/Django 2023. 3. 23. 14:32
데이터 추가
전체 데이터 조회
조건에 맞는 데이터 조회 (상세조회)
데이터 수정
데이터 삭제
-> 이전 게시물과 이어지며 위의 다섯가지를 구현해보자
config 폴더의 urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('member/', include('member.urls')), ]
member 폴더의 urls.py
from django.urls import path from . import views urlpatterns = [ path("", views.index), path("list/", views.list), path("view_regist/", views.view_regist), path("regist/", views.regist), path("detail/<str:user_id>", views.detail), path("view_update/<str:user_id>", views.view_update), path("update/<str:user_id>", views.update), path("delete/<str:user_id>", views.delete), ]
url은 위와 같이 지정해주었다.
<str:user_id>는 pk 역할을 할 회원의 아이디가 들어오게 해주었다.
Spring에서는 @RequestParm 이나 @PathVariable 등으로 받아줬던 자리이다.
만약 String이 아닌 int 타입의 pk가 들어온다면 <int:seq> 이런 형식으로 정의해주면 될 것이다!
member 폴더의 models.py
from django.db import models # 테이블 class Member(models.Model): userId = models.CharField(max_length=20) userName = models.CharField(max_length=20) userPass = models.CharField(max_length=12) userEmail = models.CharField(max_length=50) registDate = models.DateTimeField(null=True)
나는 이전 게시물에서 만들어놓은 것을 가져왔기 때문에 따로 설정을 안했지만
만약 지금 새로 테이블을 만들었다면 makemigrations와 migrate을 통해 DB에 반영하는 것을 잊지 말자
전체 데이터 읽어오기 - views.py & html
list.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>List</title> </head> <body> <h1>List</h1> <a href="../view_regist/">회원등록</a> <table> <!-- member_list가 존재하면 --> {% if member_list %} {% for member in member_list %} <tr> <td><a href="../detail/{{member.userId}}">{{ member.userId }}</a></td> <td>{{ member.userName }}</td> <td>{{ member.userEmail }}</td> <td>{{ member.registDate }}</td> <td><a href="../view_update/{{member.userId}}">수정</a></td> <td><a href="../delete/{{member.userId}}">삭제</a></td> </tr> {% endfor %} <!-- member_list가 존재하지 않으면 --> {% else %} <h3>회원이 없습니다.</h3> {% endif %} </table> </body> </html>
views.py
def list(request): # Member의 모든 데이터를 가입일 내림차순으로 member_list = Member.objects.order_by('-registDate') context = {'member_list':member_list} return render(request, 'member/list.html', context)
새 데이터 등록 - views.py & forms.py & html
회원 등록 시 html에서 입력한 정보들은 어떻게 데이터베이스로 보낼까? Form 객체를 만들어서 활용하면 된다!
Spring VO객체 = Django Form객체
member폴더에 forms.py 파일을 만들어 Form 객체를 담아준다.
여기서 만든 MemberForm은 데이터 수정에서도 사용될 예정이다.
forms.py
from django import forms from .models import Member class MemberForm(forms.ModelForm): class Meta: model = Member fields = ['userId','userName','userPass','userEmail']
views.py
def regist(request): print('regist process') if request.method == 'POST': form = MemberForm(request.POST) # userId,userName,userPass,userEmail member = form.save(commit=False) # DB에는 반영x member.registDate = timezone.now() # registDate member.save() # DB에 반영 return redirect('../list')
regist.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Regist</title> </head> <body> <h1>Regist</h1> <form action="../regist/" method="post"> <!-- post로 보내려면 보안처리 필요 --> {% csrf_token %} <table> <tr> <td>아이디</td> <td><input type="text" name="userId"></td> </tr> <tr> <td>이름</td> <td><input type="text" name="userName"></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" name="userPass"></td> </tr> <tr> <td>이메일</td> <td><input type="text" name="userEmail"></td> </tr> <tr> <td>가입일</td> <td><input type="text" name="registDate" value="{{ dateInfo }}" readonly="readonly"></td> </tr> <tr> <td></td> <td><input type="submit" value="등록"></td> </tr> </table> </form> </body> </html>
조건에 맞는 데이터 조회 - views.py & html
views.py
def detail(request, user_id): member = Member.objects.get(userId = user_id) context = {'member':member} return render(request, 'member/detail.html', context)
detail.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Detail</title> </head> <body> <table> <tr> <td>아이디</td> <td>{{ member.userId }}</td> </tr> <tr> <td>이름</td> <td>{{ member.userName }}</td> </tr> <tr> <td>비밀번호</td> <td>{{ member.userPass}}</td> </tr> <tr> <td>이메일</td> <td>{{ member.userEmail }}</td> </tr> <tr> <td>가입일</td> <td>{{ member.registDate }}</td> </tr> </table> </body> </html>
데이터 수정 - views.py & html
views.py
def view_update(request, user_id): member = Member.objects.get(userId = user_id) context = {'member':member} return render(request, 'member/update.html', context) def update(request, user_id): member = Member.objects.get(userId = user_id) # 원래 회원 정보 if request.method == 'POST': form = MemberForm(request.POST, instance=member) # 새 정보로 원래 정보 대체 member = form.save(commit=False) member.save() return redirect('../list')
update.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Update</title> </head> <body> <form action="../update/{{member.userId}}" method="post"> <!-- post로 보내려면 보안처리 필요 --> {% csrf_token %} <table> <tr> <td>아이디</td> <td><input type="text" name="userId" value="{{member.userId}}"></td> </tr> <tr> <td>이름</td> <td><input type="text" name="userName" value="{{member.userName}}"></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" name="userPass" value="{{member.userPass}}"></td> </tr> <tr> <td>이메일</td> <td><input type="text" name="userEmail" value="{{member.userEmail}}"></td> </tr> <tr> <td>가입일</td> <td><input type="text" name="registDate" value="{{member.registDate}}" readonly="readonly"></td> </tr> <tr> <td></td> <td><input type="submit" value="수정"></td> </tr> </table> </form> </body> </html>
데이터 삭제 - views.py & html
def delete(request, user_id): member = Member.objects.get(userId = user_id).delete() return redirect('../list')
여기까지가 가장 기본적인 CRUD 코드이다!
마지막으로 import까지 포함한 전체 views.py 파일의 코드
views.py
from django.shortcuts import render, redirect from django.http import HttpResponse from .models import Member from datetime import datetime from .forms import MemberForm from django.utils import timezone def index(request): return HttpResponse("<h1> Hello Django </h1>") def list(request): # Member의 모든 데이터를 가입일 내림차순으로 member_list = Member.objects.order_by('-registDate') context = {'member_list':member_list} return render(request, 'member/list.html', context) def view_regist(request): dateInfo = datetime.now().strftime('%Y-%m-%d %H:%M:%S') context = {'dateInfo':dateInfo} return render(request, 'member/regist.html', context) def regist(request): print('regist process') if request.method == 'POST': form = MemberForm(request.POST) # userId,userName,userPass,userEmail member = form.save(commit=False) # DB에는 반영x member.registDate = timezone.now() # registDate member.save() # DB에 반영 return redirect('../list') def detail(request, user_id): member = Member.objects.get(userId = user_id) context = {'member':member} return render(request, 'member/detail.html', context) def view_update(request, user_id): member = Member.objects.get(userId = user_id) context = {'member':member} return render(request, 'member/update.html', context) def update(request, user_id): member = Member.objects.get(userId = user_id) if request.method == 'POST': form = MemberForm(request.POST, instance=member) member = form.save(commit=False) member.save() return redirect('../list') def delete(request, user_id): member = Member.objects.get(userId = user_id).delete() return redirect('../list')
'웹 Web > Django' 카테고리의 다른 글
[Django] 장고 프로젝트 만드는 순서 (0) 2023.03.23 [PyCharm & Django] 설치 및 환경설정 (0) 2023.03.22