Blog 기능 구현
URLconf 코딩
URL 패턴은 사이트를 다루는데 있어 굉장히 중요합니다. Django의 경우, app의 url과, root의 url이 구분되어있습니다.
우선 root의 url인 ev/urls.py
를 수정합니다.
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/',include('blog.urls'))
]
이제 주소의 /blog에 들어오면 blog앱으로 연결되도록 하였습니다.
blog/urls.py
를 수정하여 url 패턴마다 저희가 원하는 링크가 연결되도록 합니다.
from django.urls import include, path, re_path
from . import views
app_name = 'blog'
urlpatterns=[
# / 의 경우
path('',views.PostLV.as_view(), name='index'),
# post/의 경우
path('post/',views.PostLV.as_view(),name='post_list'),
# 여기서부터는 정규식
# /post/django-example/과 같은 slug를 가진 주소의 경우
re_path('post/(?P<slug>[-\w]+)',views.PostDV.as_view(), name='post_detail'),
]
와 같은 형태가 되어야합니다. /blog/의 링크로 들어왔을 때는 views.py
의 PostLV라는 메소드가 보여주는 view가 나오도록 설정하고, 이름을 index로 설정합니다.
다른 주소들 즉, /blog/post/
로 들어오는 경우에는 post_list를 보여주도록 하지만, 같은 메소드로 표현하므로, /blog
의 주소로 접속하는 것과 같은 화면이 나옵니다. re_path 는 주소에 정규식을 사용할 수 있도록 해줍니다. slug값을 통해 받아온 주소는 해당 글로 연결되도록 설정합니다.
View 작성
이제 blog/views.py
를 수정하여 화면에 보여줄 view를 작성하도록 합니다.
from django.views.generic import ListView, DetailView
from blog.models import Post
# ListView
class PostLV(ListView):
model = Post
template_name = 'blog/post_all.html'
context_object_name = 'posts'
paginate_by = 2
# DetailView
class PostDV(DetailView):
model = Post
Template 작성
리스트뷰는 글의 목록을, 디테일뷰는 글의 자세한 모습을 보여줍니다. 그렇다면, 글을 보여주는 페이지 또한 필요하게 됩니다. 그 페이지는 html 파일로 만들어서 저장합니다.
blog/templates/blog
와 같은 구조의 디렉토리를 생성합니다. 이런식으로 해주는 이유는 template을 사용하는 것이 blog 말고도 다른 app들도 있기 때문입니다.
blog/templates/blog/post_all.html
을 만들고, 리스트들을 보여줄 수 있는 코드를 작성합니다.
<h1> Blog Post List </h1>
<hr>
<div>
<span>
Page of
</span>
</div>
제너릭 뷰는 class-based view로, 그 중 하나인 ListView는 개체 목록 표시 의 개념을 추상화하고 있습니다. ListView를 사용하여 만든 view의 데이터를 가져오기 때문에, 이전페이지 및 다음페이지에 글이 있는지의 여부나, 현재 페이지에 띄울 글들을 조회하는 것과 같은 동작이 가능합니다.
마찬가지로 제너릭뷰인 DetailView를 이용하여 작성한 Detail 페이지 역시 해당 제너릭뷰의 기능을 가져와 사용가능합니다.
blog/templates/blog/post_detail.html
파일을 생성하고, 다음과 같이 편집합니다.
<h2> </h2>
<p class = "other_posts">
</p>
<p class="date"></p>
<br/>
<div class="body">
</div>
이제 manage.py
가 있는 위치로 돌아가 python manage.py runserver
를 실행하고, localhost:8000을 열어보면, admin 페이지에서 작성한 글들이 생성되어 있는 것을 확인할 수 있습니다.