ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
Designed by Tistory.