Django #2 - 클래스형뷰 사용하기

Corner·2022년 4월 23일
0

django

목록 보기
3/14
post-thumbnail

클래스형뷰 사용하기

settings.py -> models.py -> urls.py -> views.py -> templates 순으로 코딩한다.

settings.py는 딱히 건들것이 없으므로 넘어간다.

models.py

from django.db import models

class Todo(models.Model):
    # 컬럼 =
    name = models.CharField('NAME', max_length=5, blank=True) # blank는 빈값을 허용한다.
    todo = models.CharField('TODO', max_length=50) # blank Default는 False 이다.

    def _str_(self):
        return self.todo

admin.py

from django.contrib import admin

from todo.models import Todo


@admin.register(Todo) # 컨트롤 + 스페이스바 두번눌러서 제안
class TodoAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'todo')

터미널창을 열어서 마이그레이션 파일을 만든다.

python manage.py makemigrations

파일을 만들었으면

 python manage.py migrate 

데이터베이스에 반영해서 테이블을 만든다.

이렇게 모델 작업은 끝나고 나면 어드민 사이트에서 테이블 모습을 확인할 수 있다.

runserver로 서버를 실행해 http://127.0.0.1:8000/


ADD TODO 버튼을 눌러 테스트용으로 작성해본다.

컬럼은

ID, TODO, NAME을 확인할 수 있다.


urls.py 작업

이제 urls.py 소스 작업을 진행하기 전 서버는 중단해둔다.

urls.py는 프로젝트 폴더mysitetodo 앱 폴더 두 군데에 존재한다.

mysite/urls.py는 include 기능만 하기 때문에 1차 작업에 했었을 때와 변경사항은 없다.

"""mysite URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),

    path('todo/', include('todo.urls')),
]

todo/urls.py 를 코딩하기 전에 url 패턴과 뷰, 템플릿 파일은 하나씩 매핑이 되므로 매핑 관계를 미리 정리하고 이해해야 한다.

URL 패턴뷰 이름템플릿 파일명
/admin/(장고 기본제공)
/todo/vonly/TodoVueOnlyTV(TemplateView)todo_vue_only.html
/todo/create/TodoCV(CreateView)todo_form.html
/todo/list/TodoLV(ListView)todo_list.html
/todo/99/delete/TodoDelV(DeleteView)todo_confirm_delete.html

admin url과 todo/vonly url은 이미 지난 시간에 코딩을 완료 하였다.

이번엔 /todo/create/ , /todo/list/ , /todo/99/delete 이 세가지 url을 개발 예정이다.

DeleteView는 파일명을 TodoDV로 할 수도 있었지만, DV는 DetailView에 많이 사용되므로 충돌을 방지하기 위해 DelView로 짓는 것이 좋다.

todo/urls.py

from django.urls import path
from . import views

app_name = 'todo'
urlpatterns = [
    path('vonly/', views.TodoVueOnlyTV.as_view(), name='vonly'),

    path('create/', views.TodoCV.as_view(), name='create'),
    path('list/', views.TodoLV.as_view(), name='list'),
    path('<int:pk>/del', view.TodoDelV.as_view(), name='delete'), 
      # delete는 pk(기본키)를 Integer로 넣어야 하기 때문에 <int:pk> 식으로 작성하는데, 이러한 표현을 path-coverter라고 한다.
    # 숫자가 들어오면 Integer로 변환해서 view에 넘겨주는 역할을 한다.
]

delete는 pk(기본키)를 Integer로 넣어야 하기 때문에 <int:pk> 식으로 작성하는데, 이러한 표현을 path-coverter라고 한다.

숫자가 들어오면 Integer로 변환해서 view에 넘겨주는 역할을 한다.

Views.py 작업

views.py

부가 설명은 소스의 주석을 작성해두었다.

from django.urls import reverse_lazy
from django.views.generic import TemplateView, CreateView, ListView, DeleteView

from todo.models import Todo


class TodoVueOnlyTV(TemplateView):
    template_name = 'todo/todo_vue_only.html'
# template_name 속성은 RedirectView를 제외한 모든 뷰에서 사용되기 때문에 template_name을 먼저 지정해준다.
# 그 외 필요한 속성들을 override 한다.
class TodoCV(CreateView):
    model = Todo
    fields = '__all__' # 모든 fields를 쓰는 표현
    template_name = 'todo/todo_form.html'
    success_url = reverse_lazy('todo:list')
    # 폼 처리가 끝나면 리다이렉트 시켜줄 url은 todo의 list로 이동시킨다.

class TodoLV(ListView):
    model = Todo
    template_name = 'todo/todo_list.html'

class TodoDelV(DeleteView):
    model = Todo
    template_name = 'todo/todo_confirm_delete.html'
    success_url = reverse_lazy('todo:list')
    # success_url을 지정할 때는 reverse_lazy 함수나 reversed 함수를 결정해서 사용하는데,
    # 여기서 reverse_lazy를 사용해야 한다. 그 이유는, success_url이 실행되는 시점에는
    # urls 파일 모듈이 아직 로딩이 안되어있기 때문이다. success_url = reverse_lazy 함수를 사용한다고 알아두면 좋다. 

class를 작성할 때 빨간줄이 뜬다면 import를 시켜주어야 하는 것을 잊지말자. (Ctrl + Space Bar 두번)

success_url을 지정할 때는 reverse_lazy 함수나 reversed함수를 결정해서 사용하는데,
여기서 reverse_lazy를 사용해야 한다. 그 이유는, success_url이 실행되는 시점에는
urls 파일 모듈이 아직 로딩이 안되어있기 때문이다. success_url = reverse_lazy 함수를 사용한다고 알아두면 좋다.


GitHub Source

👉🏻깃허브 소스

profile
Full-stack Engineer. email - corner3499@kakao.com,

0개의 댓글