Django 7

김기현·2022년 2월 5일
0

django

목록 보기
7/8
post-thumbnail

이번 섹션에서는 django에서 url이 어떻게 동작하는지 알아보고 template를 적용해봅시다!

URL

아래의 코드는 urlpatterns의 기본 구조입니다.

urlpatterns = [path("admin/", admin.site.urls),]

path부분은 url이고, 뒤에는 view입니다. url은 /rooms, /login ...에 해당하는 내용으로 요청에 바로 응답하는 방법이고, view는 사용자가 이 요청에 반응하는 방법입니다.

devided mapping

모든 url들이 URL_conf에서 mapping을 할 때 config/urls.py에서 전부 확인한다면 이는 객체지향의 특성에 어긋납니다. /room/~과 관련된 것은 room이라는 app에서 처리를 하고 /user/과 관련된 처리는 user이라는 app에서 처리를 하도록 합니다.

그리고 config/urls.py에는 해당 url이 들어왔을 때 어느 위치에서 처리해야할지만 등록합니다.

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


urlpatterns = [
    path("", include("core.urls", namespace="core")),
    path("rooms/", include("rooms.urls", namespace="rooms")),
    path("admin/", admin.site.urls),
]

name

나중에 해당 url을 처리할때 url전부를 하드코딩하는 것 이 아니라, name=""으로 지정해 간편하게 해당 url을 지칭할 수 있습니다.

from django.urls import path
from rooms import views as room_views

app_name = "core"

urlpatterns = [path("", room_views.all_rooms, name="home")]

namespace

예를 들어 room 이라는 app에도 core 라는 view가 있고, user 라는 app에도 core 라는 view가 있으면 이를 구분해야 하는데요! 이 때 namespace를 사용하여 구별해주면 됩니다. room:coreuser:core 로 구별합니다. 이를 사용하기 위해선 app="core"처럼 label을 지정해서 사용해야 합니다.

HttpResponse

view는 해당 url로 매번 들어갈 때마다 HttpResponse를 생성합니다. 그리고 HttpResponse를 응답해줘야만 합니다. 이 방식이 브라우저를 구성하는 기본 방식입니다.

from django.http import HttpResponse

def all_rooms(request):
	return HttpResponse(content="<h1>Hello</h1>")

request를 받으면 단순히 HttpResponse로 응답합니다. 그러나 template(html로 구성)를 rendering(html을 렌더링_보냄)하면 수동적으로 매번 작성하지 않아도 됩니다.

Render

render는 HttpResponse 안에 html을 넣어서 보내줄 수 있습니다. 즉 template를 렌더링할 수 있습니다.

from django.shortcuts import render

def all_rooms(request):
	return render(request, "all_rooms.html", context={"rooms":all_rooms})

request 없이 response를 할 수 없으며 "all_rooms.html"이라는 파일을 template_name 자리에 넣어줍니다.

template 파일은 templates를 위한 폴더를 만들어 관리합니다.(templates/all_rooms.html)

그리고 settings.py에 templates라는 파일을 인식할 수 있도록 디렉토리를 정해줍니다.

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [os.path.join(BASE_DIR, "templates")],
        .
        .
    }]

template

template을 꾸미는 방법을 알아봅시다. 경로는 templates/all_rooms.html입니다.

{% for room in rooms %} 	#view / context={"rooms":all_rooms})
	<h1>{{room.name}}</h1>
{% endfor %}

{{room.name}}로 room이 object인 것처럼 대합니다. 왜냐하면 해당의 room은 object이기 때문입니다.

RECAP

template이름은 반드시 template폴더안에 있는 이름과 같아야 하고, view이름은 urls.py(divide and conquer했으므로 이 경우 core/urls.py)이름과 같아야만 합니다.

urlpatterns = [path("", room_views.all_rooms, name="home")]
profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글