본문 바로가기

Python/Django

[Django] Class based View - UpdateView

이번에는 UpdateView 에 대해서 알아보겠습니다. 이것은 DetailView 와 CreateView 의 혼합이다.

화면은 CreateView 화면을 재 사용하며,

update 를 위해서 DetailView 와 동일하게 PK 를 이용하여 해당 정보만 업데이트 한다.


클래스 기반 뷰 하위에는 생성, 상세, 업데이트, 삭제, 리스트 등이 있다.

Model based Class base Views - Create, Detail, Update, Delete, List.

 

간단하게 설명하면, 모델에서 인스턴스 생성, 모델 인스턴스에 대한 DetailView 생성, 인스턴스 업데이트 및 삭제, 

여러 인스턴스/디비에 있는 특정 모델의 모든 인스턴스 나열 이라고 할 수 있다.


 

views.py 에서 UpdateView 임포트, TeacherUpdateView 인스턴 생성 - class TeacherUpdateView(UpdateView):

UpdateView 는 model_form.html(CreateView 화면) 을 공유해서 사용한다.

 

from django.shortcuts import render
from django.urls import reverse_lazy, reverse
from django.views.generic import TemplateView, FormView, CreateView, ListView, DetailView, UpdateView

from classroom.forms import ContactForm
from classroom.models import TeacherModel

...

class TeacherCreateView(CreateView):
    model = TeacherModel
    # model 을 설정하면 자동으로 model_form.html 을 찾는다(동일 장고 앱레벨에서)
    # 여기서는 teachermodel_form.html 파일을 찾는다.
    # .save() 가 자동으로 호출된다.
    fields = '__all__' # ['first_name', 'last_name', 'subject']
    success_url = reverse_lazy('classroom:thank_you')

...

class TeacherUpdateView(UpdateView):
    # Share model_form.html --- PK
    model = TeacherModel
    fields = '__all__' # ['first_name', 'last_name']
    success_url = reverse_lazy('classroom:list_teacher')

 

 

urls.py 에 path 추가.

 

# domain.com/classroom
urlpatterns = [
    # path('', views.home_view, name='home'), # path expects a function!
    path('', views.HomeView.as_view(), name='home'), # 클래스를 가지고 경로에 대한 함수를 반환
    path('thank_you/', views.ThankYouView.as_view(), name='thank_you'), 
    path('contact/', views.ContactFormView.as_view(), name='contact'), 
    path('create_teacher/', views.TeacherCreateView.as_view(), name='create_teacher'), 
    path('list_teacher/', views.TeacherListView.as_view(), name='list_teacher'), 
    path('detail_teacher/<int:pk>', views.TeacherDetailView.as_view(), name='detail_teacher'), 
    path('update_teacher/<int:pk>', views.TeacherUpdateView.as_view(), name='update_teacher'), 
]

 

 

teachermodel_list.html 수정.

 

<body>
    <h1>List of Teachers (ListView)</h1>
    <ul>
        <!-- views 에서 context_object_name 을 설정하면 object_list->"설정한 변수명"으로 변경가능  -->
        {% for teacher in teacher_list %}
            <!-- <li>{{teacher.first_name}} {{teacher.last_name}}</li> -->
            <li>
                <a href="/classroom/detail_teacher/{{teacher.id}}">{{teacher.first_name}} {{teacher.last_name}}</a>
                <button><a href="/classroom/update_teacher/{{teacher.id}}">Update Information</a></button>
                
            </li>
        {% endfor %}
    </ul>
</body>

 

 

실행 화면