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
는 프로젝트 폴더mysite
와 todo
앱 폴더 두 군데에 존재한다.
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
부가 설명은 소스의 주석을 작성해두었다.
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
👉🏻깃허브 소스