Juni_Dev_log

블로그 앱 만들기 ③ "개발 코딩하기 - URLconf 코딩하기 & View 코딩하기" with Django 본문

Project/Blog APP 만들기 (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

 

블로그 앱 만들기 ② "개발 코딩하기 - 뼈대 만들기&모델 코딩하기" with Django

① 뼈대 만들기 애플리케이션 만들기부터 시작하면 된다. (vDjBook) python manage.py startapp blog 블로그 앱에 대한 설정 클래스를 settings.py 파일에 등록한다. 'blog.apps.BlogConfig' ② 모델 코딩하기 블..

juni-dev-log.tistory.com

(다음 포스팅)

2020/08/22 - [Project/Blog APP 만들기 (Django)] - 블로그 앱 만들기 ④ "개발 코딩하기 - 템플릿 코딩하기" with Django

 

블로그 앱 만들기 ④ "개발 코딩하기 - 템플릿 코딩하기" with Django

⑤ 템플릿 코딩하기 블로그 앱의 포스트 리스트 및 포스트 상세 내용을 화면에 보여주는 템플릿 파일을 코딩하는 것이다. post_all.html post_detail.html post_archive.html post_archive_year.html post_archive..

juni-dev-log.tistory.com

 

Comments