이번에는 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 화면을 통해서 이전에 입력된 데이터가 저장되어 있는것을 볼 수 있다.
'Python > Django' 카테고리의 다른 글
[Django] Class based View - DetailView (0) | 2022.12.17 |
---|---|
[Django] Class based View - ListView (0) | 2022.12.17 |
[Django] Class based View - FormView (0) | 2022.12.16 |
[Django] Class based View - TemplateView (0) | 2022.12.15 |
[Django] Forms - ModelForms 커스터마이징 (0) | 2022.12.15 |