Django Template 및 View 구현하기

|

URL 과 View간 맵핑

Django에서 URLView는 1:1로 맵핑됨. 예를 들면 다음과 같은 형태로 맵핑할 수 있습니다.

URL 패턴 View 이름 처리하는 내용
/posts/ index() index.html 템플릿을 렌더링
/posts/3 detail() 각 포스트의 내용을 detail.html 템플릿을 통해 렌더링


urls.py 작성

urls.py에는 사이트로 요청된 URL을 이용해서 실행할 함수까지 맵핑을 할 수 있습니다. urls.py의 위치는 프로젝트 전체 영역에 해당하는 blog 디렉토리 아래에 위치하며, 각 어플리케이션마다 별도로 작성해서 관리할 수도 있습니다.

로직의 개발 순서는 정해지진 않았지만, URLConf -> View -> Template 형태로 개발하는 것이 일반적입니다.

여기서는 각 어플리케이션마다 urls.py 파일을 정의한 다음, 프로젝트 전체 URLConf에서 각 파일을 include 하도록 하는 예제가 포스팅되었습니다.


post/urls.py

urls.py 파일이 존재하지 않기 때문에 생성해줍니다. 맵핑될 URL 포맷은 정규식으로 작성합니다.

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

from django.conf.urls import url
from post import views

app_name = 'post'

urlpatterns = [
    url(r"^$", views.index, name="index"),
    # url(r"^(?P<post_id>\d+)/$", views.detail, name="detail"),
]


blog/urls.py

그리고, 프로젝트 전체에 해당하는 blog/urls.py에는 다음과 같이 작성합니다.

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

from django.conf.urls import url, include
from post import views

urlpatterns = [
    url(r"^admin/", admin.site.urls),
    url(r"^post/", include("post.urls", namespace="post")),
]


view 작성

from django.shortcuts import render
from post.models import Post


# Create your views here.

def index(request):
    post_list = Post.objects.all().order_by("-pub_date")[:10]
    context = {"post_list": post_list}
    return render(request, "post/index.html", context)


template 작성

post/templates/post/ 디렉토리 아래에 index.html 파일을 생성합니다.

{% if post_list %}
    <ul>
        {% for post in post_list %}
            <li><a href="/post/{{ post.id }}/">{{ post.title }}</a></li>
        {% endfor %}
    </ul>

{% else %}
    <p>Empty List</p>
{% endif %}


확인

그 이후 http://127.0.0.1:8000/admin 사이트에서 Post 테이블의 아이템을 추가한다음 http://127.0.0.1:8000/post에서 아이템 리스트를 조회할 수 있습니다.


추가 화면 구성

post/urls.py 수정

urlpatterns = [
    url(r"^$", views.index, name="index"),
    url(r"^(?P<post_id>\d+)/$", views.detail, name="detail"),
]


post/view.py 수정

from django.shortcuts import render, get_object_or_404
from post.models import Post


# Create your views here.

def index(request):
    post_list = Post.objects.all().order_by("-pub_date")[:10]
    context = {"post_list": post_list}
    return render(request, "post/index.html", context)


def detail(request, post_id):
    item = get_object_or_404(Post, pk=post_id)
    return render(request, "post/detail.html", {"post": item})


post/template/post/detail.html

<h1>{{ post.title }}</h1>
<h3>{{ post.text }}</h3>