[REAL Python – Django] – “Django – post 리스트 페이지(FBV)”
[REAL Python – Django] – “Django – post 리스트 페이지(FBV)”
Django의 urls.py
: 웹 사이트의 지도
Django의 urls.py
파일은 사용자가 어떤 url에 방문했을 때 어떤 곳으로 가야 하는지를 알려 주는 지도와 같은 파일입니다.
from django.contrib import admin
from django.urls import path, include # include 도 추가로 import
urlpatterns = [
path('blog/', include('blog.urls')), # blog/로 접근하면, blog.urls 파일을 참고해라!
path('admin/', admin.site.urls),
]
위의 코드를 urls.py
에 입력합니다. 보다 효과적으로 관리해주기 위해서 blog
에 관련된 url
들은 blog
디렉토리의 urls.py
를 참고하게끔 코드를 작성해 주었습니다. include('blog.urls')
가 바로 그것입니다.
이제 blog 디렉토리의 urls.py
를 다시 작성했습니다.
from django.urls import path
from . import views # 같은 디렉토리의 views를 import
urlpatterns = [
path('', views.index), # blog/ 면 views의 index() 함수를 수행
]
위의 코드에서 views.py
의 index()
함수를 수행하라는 줄이 있는데, index()
함수를 views
에 작성해 주었습니다.
from django.shortcuts import render
def index(request):
return render(
request,
'blog/index.html',
)
Django의 render()
함수는 아래와 같이 정의되어 있습니다.
def render(request, template_name, context=None, content_type=None, status=None, using=None):
"""
Return an HttpResponse whose content is filled with the result of calling
django.template.loader.render_to_string() with the passed arguments.
"""
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
위의 함수는, 장고 프로젝트 공식 문서 의 표현을 빌리자면 다음과 같습니다.
render()
함수는 request 객체를 첫번째 인수로 받고, 템플릿 이름을 두번째 인수로 받으며, context 사전형 객체를 세전째 선택적(optional) 인수로 받습니다. 인수로 지정된 context로 표현된 템플릿의HttpResponse
객체가 반환됩니다.
간단히, index()
함수의 역할은 index.html
이라는 파일을 사용자에게 보내주는 것입니다. render()
을 사용함으로써 말이죠. 이제 템플릿 파일만 작성해 주고, 동작하는지 알아보겠습니다.
임의의 index.html
파일을 작성하고, blog/
에 접속해 보면 정상적으로 동작합니다.
포스트 보여주기
from django.shortcuts import render
from .models import Post
def index(request):
posts = Post.objects.all()
# print(posts)
# <QuerySet [<Post: [1] This is first post.>]>
return render(
request,
'blog/index.html',
{
'posts': posts,
}
)
위의 코드를 추가했습니다. 딕셔너리 객체를 세 번째 인수로 넣어주었습니다. render()
함수에서, 딕셔너리 객체는 세 번째 선택적인 인수로 들어올 수 있습니다. 위의 인용구에서 그것을 확인할 수 있습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Blog</title>
</head>
<body>
<h1>Blog</h1>
{% for p in posts %}
<hr/>
<h2>{{ p.title }}</h2>
<h4>{{ p.created_at }}</h4>
<p>{{ p.content }}</p>
{% endfor %}
</body>
</html>
템플릿을 위의 코드로 수정하여 제목, 생성일자, 내용을 나타내도록 하였습니다.