웹 프로그래밍/Django

[Django] 6. 장고 URL 지정하기(라우팅) - urls.py, views.py

by seokii 2022. 5. 2.
728x90
반응형

Django 글 작성 목록

urls.py

웹 사이트를 구현함에 있어 모든 페이지마다 url의 지정이 필요합니다.

장고에서는 이를 urls.py 파일을 통해 구현할 수 있습니다.

즉, 장고에서는 urls.y 파일을 통해 라우팅을 진행할 수 있습니다.

 

'프로젝트/urls.py' 파일을 열고 코드를 추가하겠습니다.

from django.contrib import admin
from django.urls import path
from django.conf.urls import include

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

blog/로 접속하는 경우, blog앱의 urls.py를 참고한다는 내용입니다.

blog앱 폴더안에는 urls.py 파일이 없으니 추가하도록 하겠습니다.

위와 같이 blog앱 폴더 안에 urls.py를 추가했습니다.

 

views.py

urls.py에 들어가는 함수 혹은 클래스는 views.py에서 정의할 수 있습니다.

함수 혹은 클래스 방식으로 구현할 수 있는데 이를 FBV, CBV라 지칭합니다.

FBV(Function based view)

FBV는 함수에 기반을 둔 방법입니다.

함수를 직접 만들고, 원하는 기능을 직접 구현할 수 있습니다.

CBV(Class based view)

CBV는 장고가 제공하는 클래스에 기반을 둔 방법입니다.

장고는 웹 개발시, 반복적으로 많이 구현하는 것들에 대해서 클래스로 제공하고 있습니다.

CBV는 이러한 클래스들을 활용하는 방법입니다.

 

저는 간단하게 웹 페이지를 만들고 구현할 것이기 때문에 CBV 방식으로 진행하도록 하겠습니다.

 

포스트 목록 페이지 - ListView

from django.shortcuts import render
from django.views.generic import ListView
from .models import Post

# Create your views here.

class PostList(ListView):
    model = Post

먼저, blog/views.py 파일에 다음 코드를 작성합니다.

ListView와 클래스를 추가한 내용입니다.

from django.urls import path
from . import views

urlpatterns = [
    path('', views.PostList.as_view()),
]

blog/urls.py에는 다음과 같은 내용을 추가합니다.

url의 끝이 blog/ 일 때, PostList 클래스로 처리하겠다는 내용입니다.

서버를 실행하고 /blog 을 붙여 url에 접속하면, 위와 같은 오류가 발생합니다.

url 설정은 잘 적용되었지만, html 파일이 없기 때문에 발생하는 오류입니다.

html 파일을 만들기 위해서,

blog앱 폴더 내에 templates 폴더를 만들고 다시 blog폴더를 만든 후, index.html 파일을 생성합니다.

그 후, views.py 파일에서 PostList 클래스에 다음 내용을 추가합니다.

class PostList(ListView):
    model = Post
    template_name = 'blog/index.html'

template_name = 'blog/index.html' 코드를 통해

템플릿 이름을 지정해줌으로써 index.html 파일을 지정하겠다는 의미입니다.

index.html 파일의 내용은 다음과 같습니다.

위의 결과는 서버를 실행하고 /blog/의 url로 접속한 모습입니다.

위의 코드를 추가해, 받아온 레코드들을 for문으로 출력할 수 있습니다.

for 문의 부분은 {% %}로 감싸주고, 변수는 {{ }}로 감싸 처리합니다.

최신 글의 순서를 상단으로 위치시키기 위해서, views.py의 클래스에 ordering을 '-pk'로 지정합니다.

get_absolute_url 이라는 함수를 아직 정의하지 않았기 때문에, 링크를 눌러도 상세 페이지로 이동하지는 않습니다. blog/models.py 파일에서 바로 정의해보도록 하겠습니다.

위와 같이 get_aboslute_url 함수를 추가했습니다.

 

포스트 상세 페이지 - DetailView

여러 레코드를 불러와 리스트를 표시할 때 ListView를 사용했습니다.

이번에는, 한 레코드에 대한 내용을 자세히 출력하기 위해서 DetailView를 사용하겠습니다.

마찬가지로, views.py 파일에 코드를 추가합니다.

model = Post로 모델을 정의하고, template_name을 통해 html 템플릿을 지정했습니다.

blog/urls.py 파일에도 위와 같은 코드를 작성해 url을 지정합니다.

 

최종적으로, 위와 같은 결과를 완성했습니다.

다음 글에서는 구현한 내용에 부트스트랩을 적용해보도록 하겠습니다.

 

 

728x90
반응형

댓글