일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알고리즘
- ART_Cinema
- 북마크앱
- 장고 개발 순서
- passport.js
- 북마크만들기
- 개발
- python
- Django Blog
- 장고 프로젝트 순서
- Exercism
- mongodb
- 자바스크립트
- 예술영화추천
- 독립영화플랫폼
- Django
- MyPick31
- MYSQL
- 타사인증
- Algorithm
- 장고
- 프로젝트
- join()
- Blog
- Node.js
- til
- 파이썬 웹프로그래밍 장고
- JavaScript
- Bookmark
- 장고 프로젝트
- Today
- Total
Juni_Dev_log
블로그 앱 만들기 ③ "개발 코딩하기 - URLconf 코딩하기 & View 코딩하기" with Django 본문
블로그 앱 만들기 ③ "개발 코딩하기 - URLconf 코딩하기 & View 코딩하기" with Django
Juni_K 2020. 8. 21. 23:40③ URLconf 코딩하기
ROOT_URLCONF 와 APP_URLCONF 2개의 파일에 코딩을 할 것이다.
이번 블로그앱도 mysite/urls.py 와 blog/urls.py 2개의 파일에 코딩을 하고, 2장에서 작성한 북마크앱도 mysite/urls.py 와 bookmark/urls.py 로 수정할 것이다.
★ ROOT_URLCONF vs APP_URLCONF
장고의 공식 용어가 아니며, 설명을 위해 편의상 사용하는 용어이다. URLconf 를 2계층으로 코딩하는 것이 확장성 측면에서 유리하다.
상위 계층 URL 을 "ROOT_URLCONF" / 하위 계층 URL 을 "APP_URLCONF" 라고 부르겠다.
- ROOT_URLCONF : URL 패턴에서 보통 첫 단어는, 애플리케이션을 식별하는 단어가 온다. 첫 단어를 인식하고 해당 어플리케이션의 urls.py 파일을 포함시키기 위한 URLconf 이다. 프로젝트 디렉터리에 있는 urls.py 를 의미한다.
- APP_URLCONF : 패턴에서 애플리케이션을 식별하는 첫 단어를 제외한 그 이후 단어들을 인식해서 해당 뷰를 매핑하기 위한 URLCONF 이다. 각 애플리케이션 디렉터리에 있는 urls.py 를 의미한다.
먼저, ROOT_URLCONF 인 mysite/urls.py 를 코딩한다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# include() 함수를 통해서, 북마크앱/블로그앱의 APP_URLCONF로 처리를 위임한다.
path('bookmark/', include('bookmark.urls')),
path('blog/', include('blog.urls')),
]
다음으로, APP_URLCONF인 bookmark/urls.py 를 생성하고 코딩한다.
from django.urls import path
# URLconf 에서 뷰를 호출하기 때문에 뷰 모듈의 관련 클래스를 임포트한다.
from bookmark.views import BookmarkLV, BookmarkDV
# 애플리케이션 이름공간을 지정한다.
app_name = 'bookmark'
urlpatterns = [
# /bookmark/ 로 요청을 처리한 뷰 클래스를 지정한다.
path('', BookmarkLV.as_view(), name='index'),
# /bookmark/숫자/ 로 요청을 처리한 뷰 클래스를 지정한다.
path('<int:pk>/', BookmarkDV.as_view(), name='detail'),
]
마지막으로, APP_URLCONF 인 blog/urls.py 를 생성하고 코딩한다.
from django.urls import path, re_path
from blog import views
app_name='blog'
urlpatterns = [
# ex) /blog/
path('',views.PostLV.as_view(), name='index'),
# ex) /blog/post/
path('post/',views.PostLV.as_view(), name='post_list'),
# ex) /blog/post/django-example/
re_path(r'^post/(?P<slug>[-\w]+)/$', views.PostDV.as_view(), name='post_detail'),
# ex) /blog/archive/
path('archive/', views.PostAV.as_view(), name='post_archive'),
# ex) /blog/archive/2019/
path('archive/<int:year>/', views.PostYAV.as_view(), name='post_year_archive'),
# ex) /blog/archive/2019/nov/
path('archive/<int:year>/<str:month>/', views.PostMAV.as_view(), name='post_month_archive'),
# ex) /blog/archive/2019/nov/10/
path('archive/<int:year>/<str:month>/<int:day>/', views.PostDAV.as_view(), name='post_day_archive'),
# ex) /blog/archive/today/
path('archive/today/', views.PostTAV.as_view(), name='post_today_archive'),
]
-
URL 패턴을 정의할 때, path() 와 re_path() 함수를 같이 사용하는 것도 가능하다.
-
뷰 모듈의 모든 클래스를 각각 임포트해도 되지만, 뷰 클래스가 많을 때는 이렇게 모듈 자체를 임포트하면 편리하다.
-
필수는 아니지만, 이렇게 예시 URL을 기록해주면 이해하기 쉬워진다.
-
URL /blog/post/슬러그/요청을 처리할 뷰 클래스를 PostDV 로 지정한다. URL 패턴의 이름은 'blog:post_detail' 이 된다. 한글이 포함된 슬러그는 처리를 못한다. <slug> 컨버터는 '[-a-zA-Z0-9_]+' 만 인식한다.
path('archive/int:year/str:month/int:day/', views.PostDAV.as_view(), name='post_day_archive'),
→
re_path(r'^archive/(?<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\d{1, 2})/$)', views.PostDAV.as_view(), name='post_day_archive'),
이렇게도 가능하다.
④ 뷰 코딩하기
URLconf 에서 지정한 클래스형 제너릭 뷰를 코딩한다.
(blog/views.py)
from django.views.generic import ListView, DetailView
from django.views.generic.dates import ArchiveIndexView, YearArchiveView, MonthArchiveIndexView
from django.views.generic.dates import DayArchiveView, TodayArchiveView
from blog.models import Post
# Create your views here.
class PostLV(ListView):
model = Post
template_name = 'blog/post_all.html'
# 객체 리스트에 대한 컨텍스트 변수명을 posts 로 지정한다.
context_object_name = 'posts'
# 한 페이지에 보여주는 객체 리스트의 숫자는 2이다.페이지 기능이 활성화되면 객체 리스트 하단에 페이지를 이동할 수 있는 버튼을 만들 수 있다.
paginate_by = 2
class PostDV(DetailView):
model = Post
class PostAV(ArchiveIndexView):
model = Post
date_field = 'modify_dt'
class PostYAV(YearArchiveView):
model = Post
date_field = 'modify_dt'
# True면, 객체의 리스틀 만들어서 템플릿에 넘겨준다. False면, 디폴트.
make_object_list = True
class PostMAV(MonthArchiveIndexView):
model = Post
date_field = 'modify_dt'
class PostDAV(DayArchiveView):
model = Post
date_field = 'modify_dt'
class PostTAV(TodayArchiveView):
model = Post
date_field = 'modify_dt'
(이전 포스팅)
2020/08/21 - [Project/Blog APP 만들기 (Django)] - 블로그 앱 만들기 ② "개발 코딩하기 - 뼈대 만들기&모델 코딩하기" with Django
(다음 포스팅)
2020/08/22 - [Project/Blog APP 만들기 (Django)] - 블로그 앱 만들기 ④ "개발 코딩하기 - 템플릿 코딩하기" with Django
'Project > Blog APP 만들기 (Django)' 카테고리의 다른 글
블로그 앱 만들기 ⑤ "지금까지 작업 확인하기" with Django (0) | 2020.08.22 |
---|---|
블로그 앱 만들기 ④ "개발 코딩하기 - 템플릿 코딩하기" with Django (0) | 2020.08.22 |
블로그 앱 만들기 ② "개발 코딩하기 - 뼈대 만들기&모델 코딩하기" with Django (0) | 2020.08.21 |
블로그 앱 만들기 ① "애플리케이션 설계하기" with Django (0) | 2020.08.20 |