본문 바로가기

Python/Django

[Django] Class based View - CreateView

이번에는 CreateView 에 대해서 알아보겠습니다.

 

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

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

 

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

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

 

모델 폼을 만들고 클래스 기반의 뷰와 연결하는 방법을 알아보자.

 

1. views.py 에서 TeacherCreateView 를 생성 - CreateView 가 FormView 보다 간단하게 코딩을 할수 있다

 

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

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

class HomeView(TemplateView):
    template_name = 'classroom/home.html'

class ThankYouView(TemplateView):
    template_name = 'classroom/thank_you.html'

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

class ContactFormView(FormView): # <=== 추가 부분
    # 1. 폼 클래스 연결, 
    form_class = ContactForm # 인스턴스 생성하기전에 연결만 함.
    # 2. 폼과 연결할 template_name 설정
    template_name = 'classroom/contact.html' 

    # 3. 정상일때 이동할 URL 설정.
    # success URL?, URL is not a template.html
    success_url = '/classroom/thank_you/' 
    # 여기서 reverse 를 사용하고 싶다면 reverse_lazy() 를 사용해야 한다(lazy는 object 리턴). 외울것.
    # success_url = reverse_lazy('classroom:thank_you')

    # what to do with form?
    def form_valid(self, form):
        print(form.cleaned_data)
        # ContactForm(reques.POST)
        return super().form_valid(form)

 

 

./classroom/templates/classroom/teachermodel_form.html 생성

"model = TeacherModel" 로 설정하면 Django 에서는 자동으로 "teachermodel_form.html" 파일을 찾는다.

 

<body>
    <h1>Teacher Form</h1>
    <form action="" method="post">
        {% csrf_token %}
        {{form.as_p}}
        <input type="submit" value="제출합니다">
    </form>
</body>

 

 

./classroom/templates/classroom/home.html 에 새로운 링크를 만들어서 create_teacher 로 이동.

 

<body>
    <h1>Welcome to home.html</h1>
    <ul>
        <li>
            <a href="{% url 'classroom:thank_you' %}">THANK YOU PAGE LINK</a>
        </li>
        <li>
            <a href="{% url 'classroom:contact' %}">CONTACT PAGE LINK</a>
        </li>
        <li>
            <a href="{% url 'classroom:create_teacher' %}">CREATE NEW TEACHER PAGE LINK</a>
        </li>
    </ul>
</body>

 

 

./classroom/urls.py 에 새로운 path 를 추가한다.

 

from django.urls import path
from . import views

app_name = 'classroom'

# 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'), 
]

 

 

models.py 에서 모델 클래스 이름을 변경하여 migrate 를 새로 실행하였다.

 

(django) ~\DJANGO_COURSE_V2\11-Django-Class-Based-Views\school>python manage.py makemigrations
Was the model classroom.Teacher renamed to TeacherModel? [y/N] y
Migrations for 'classroom':
  classroom\migrations\0002_rename_teacher_teachermodel.py
    - Rename model Teacher to TeacherModel

(django) ~\DJANGO_COURSE_V2\11-Django-Class-Based-Views\school>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, classroom, contenttypes, sessions
Running migrations:
  Applying classroom.0002_rename_teacher_teachermodel... OK

(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\11-Django-Class-Based-Views\school>

 

 

실행화면

 

 

 

 

 

폼 데이터가 저장되었는지 확인하는 방법

 

(django) ~\DJANGO_COURSE_V2\11-Django-Class-Based-Views\school>python manage.py createsuperuser
Username (leave blank to use 'mike-mini'): myadmin
Email address: myadmin@myadmin.com
Password:
Password (again):
Superuser created successfully.

(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\11-Django-Class-Based-Views\school>

 

 

admin.py - 모델을 추가해야 admin 페이지에서 조회 가능함.

 

from django.contrib import admin
from .models import TeacherModel

# Register your models here.
admin.site.register(TeacherModel)

 

 

admin 페이지에 superuser 아이디와 비번을 입력하여 로그인 한다.

 

 

 

TeacherModel 화면을 통해서 이전에 입력된 데이터가 저장되어 있는것을 볼 수 있다.