๐ Url & View & Templates
๐ฅ About Url and View
๐ฅ About View And Templates
1. About Url and View
- ์ฌ์ฉ์๊ฐ Django์๊ฒ ์์ฒญํ url์ ๋ถ์ํ์ฌ ๋ฐ์ํ ๋ก์ง์ ๋งคํํ๋ ๊ณณ์ด urls.py์ด๊ณ , Django์์ ๋ก์ง์ ๋ด๋นํ๋ Function ๋๋ Class๊ฐ ์กด์ฌํ๋ ๊ณณ์ด views.py์์!
- ์ด์ urls.py๋ ์์ฒญ๋ request์ ๋ฐ๋ผ view.py์ ํจ์๋ฅผ ํธ์ถํ๊ณ , views.py๋ DB์ ์ํตํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ ์ฌ์ฉ์์๊ฒ ๋ค์ ์ ๋ฌํด์ค๋๋ค.
- ์ฌ๊ธฐ์ ๊ฒฐ๊ณผ๋ฌผ๋ค์ด๋ ์ด๋ค ๊ฐ์ ๋ฐํํ๋ค๋๊ฐ, ์ด๋ค ํ์ด์ง๋ฅผ ๋์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ฅธ ์๋ต์ ์๋ฏธํด์!
1) urlpatterns
- Django ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด urls.py๊ฐ ์๋์ผ๋ก ์๊ธด ๋ต๋๋ค. ์ด๋ฏธ ๋ฌด์ธ๊ฐ ์กด์ฌํ๋๋ฐ์. "http://127.0.0.1:8000/admin/" ๋ก ์ ๊ทผํ๋ฉด admin site๊ฐ ์๋ตํ ์ ์๋๋ก ์ฐ๊ฒฐ์์ผ๋ ๊ฒ์ด์ฃ .
- ์ด์ฒ๋ผ path("๊ฒฝ๋ก", "์คํ ๋ก์ง") ํํ๋ก ์ด๋ค url์ด ์์ฒญ๋๋ฉด, ์ด๋ค ํจ์๋ฅผ ์คํ์ํฌ์ง ๋งคํํฉ๋๋ค.
urlpatterns = [
path("admin/", admin.site.urls),
]
2) include
- urls.py์ ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํด ํจ์๋ฅผ ๋งคํํ ์ ์๊ฒ ์ง๋ง, ๊ทธ๋ผ ๋งค์ฐ ๋ณต์กํด์ ธ ๊ธฐ๋ฅ์ด ๋ง์์ง ์๋ก ๋ณต์ก๋๊ฐ ์ฌ๋ผ๊ฐ๋๋ค. ์ด๋ฅผ ์ํด App๋ณ๋ก urls.py๋ฅผ ์์ฑํ๊ณ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- ๋ค๋ง, ์์ฒญ๋ url์ ์ด๋ App์ urls.py๋ก ๋ณด๋ผ์ง๋ ์ ์ ์์ด์ผ ๊ฒ ์ฃ ? ์ด๋ด ๋, ์ฌ์ฉํ๋ ๊ฒ์ด include ๋๋๋ค.
- "path("", include("core.urls"))," ๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ์, ""๊ฐ ๋ปํ๋ ์๋ฏธ๋ ๋ฉ์ธ ํ์ด์ง์
๋๋ค. url ๋ค์ ์ด๋ค ๊ฒ๋ ๋ถ์ด์์ง ์์ ๊ฒฝ๋ก์ด์ฃ . ๋ง์น https://naver.com, https://google.com์ ๊ฐ์๊ฑฐ์์!
- ์ฆ, ๋ฉ์ธ ํ์ด์ง๊ฐ ์์ฒญ๋์์ ๋, core/urls.py์์ ์๋๋ ํจ์๋ฅผ ์ฐพ์๋ณด๋ ์๋ฏธ์ด์ฃ .
- ๐ path("", include("์ฐธ์กฐํ urls.py ๊ฒฝ๋ก"))
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path("", include("core.urls")),
path("admin/", admin.site.urls),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
- ์ด์ core/urls.py์์ ""๊ฒฝ๋ก์ ๋ฐ์ํ ํจ์๋ฅผ ๋งคํํ๋ฉด ๋๋๋ฐ์, ๋ฉ์ธ ํ์ด์ง๋ก ์ ๊ทผํ๋ฉด rooms/views.py์ all_rooms ํจ์๊ฐ ํธ์ถ๋๋๋ก ํ์์ด์.
from django.urls import path
from rooms import views as room_views
urlpatterns = [
path("", room_views.all_rooms)
]
3) request
- ์ฌ์ฉ์๊ฐ ์๋ฒ์ url์ ์์ฒญํ ๋๋ง๋ค ์ฌ์ฉ์๊ฐ form์ ๋ฌด์์ ์
๋ ฅํ๋์ง, ๋ก๊ทธ์ธ๋ ์ํ์ธ์ง ๋ฑ์ ์์ฒญ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ค์ Django๊ฐ Python object๋ก ๋ณํํ์ฌ request์ ๋ด์ ์ค๋๋ค:) ์ด์,, ์์ฒญ๊ณผ ๊ด๋ จํ ์ ๋ณด๋ฅผ request์ ๋ด๊ณ ์๊ธฐ ๋๋ฌธ์ request๋ฅผ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฐ์์ค๋๋ค.
from django.shortcuts import render
def all_rooms(request):
pass
4) HttpResponse()
- rooms/views.py์์ all_rooms ํจ์๋ฅผ ๊ฐ๋จํ๊ฒ ๋ง๋ค์์ผ๋, ๋ฉ์ธํ์ด์ง("")์ ๊ฒฝ๋ก์ธ http://127.0.0.1:8000/๋ก ์ ๊ทผํด ๋ณผ๊น์?
- HttpResponse๋ก returnํ๋ผ๊ณ ์น์ ํ๊ฒ ์๋ ค์ฃผ๋๋ฐ์, ๊ทธ๋ผ HttpResponse์ "Hello Django!"๋ฅผ ๋ฐํํด ๋ณด์ฃ .
- ๐ from django.http import HttpResponse
- ๐ return HttpResponse("๋ด์ฉ")
from django.shortcuts import render
from django.http import HttpResponse
def all_rooms(request):
return HttpResponse("Hello Django!")
- ๋ฉ์ธ ํ์ด์ง(http://127.0.0.1:8000/)์ "Hello Django"๊ฐ ์ถ๋ ฅ๋์์ด์!
- HttpResponse๋ ์ ๊ทผ๋ url์ ์์ฒญ์ ๋ฐ๋ฅธ ๊ฐ๋จํ ์๋ต(response)์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋๋ค.
from datetime import datetime
from django.shortcuts import render
from django.http import HttpResponse
def all_rooms(request):
now = datetime.now()
return HttpResponse(content=f"<h1>{now}</h1>")
5) namespace & name
- namespace๋ includeํ urls.py๋ฅผ ๊ฐ๋ฅดํค๊ธฐ ์ํ ๋ณ์นญ์ผ๋ก ์ฌ์ฉ๋์. html์์ aํ๊ทธ๋ฅผ ํตํด ๋งํฌ๋ฅผ ์ฐ๊ฒฐ์ํฌ ๋, ๊ฒฝ๋ก๋ฅผ ์ง์ ์ฐ๊ฒฐํ๋ฉด ๋งคํํ url ์ฃผ์๊ฐ ์์ ๋ ๋ ๋ง๋ค ํ
ํ๋ฆฟ์๊ฐ์ ๋ชจ๋ ๊ณณ์ ์ฐพ์ ์์ ํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ ์ค์ฌ์ค๋๋ค.
- ์ด์ namespace ์ฌ์ฉํจ์ผ๋ก์จ, ์ฐธ์กฐํ urls.py๋ฅผ ๋ฐ๋ก ์ง์ ํ ์ ์์ด์.
- namespace๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ํด๋น urls.py์ ๊ฐ์ app_name์ namespace ๊ฐ๊ณผ ์ผ์น์์ผ์ค์ผ ํด์.
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path("", include("core.urls", namespace="core")),
path("rooms/", include("rooms.urls", namespace="rooms")),
path("admin/", admin.site.urls),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
- name์ urlpatterns ์ค ์ด๋ค path๋ฅผ ๊ฐ๋ฅดํฌ์ง ๋ณ์นญ์ ์ง์ ํ๋ ์ญํ ์ด์์.
- ํ
ํ๋ฆฟ์์ namespace ๋ฐ name์ ์ง์ ํ์ง ์์๋ค๋ฉด, ์๋์ฒ๋ผ ์ง์ ๊ฒฝ๋ก๋ฅผ ์ฐ๊ฒฐํด์ฃผ์ด์ผ ํฉ๋๋ค.
<a href="/"></a>
<a href="/rooms/{{room.pk}}"></a>
- namespace์ name์ ์ง์ ํ๋ค๋ฉด, ๋ณ์นญ์ผ๋ก ๊ฐ๋ฅดํค๊ธฐ ๋๋ฌธ์ ๋งคํ๋ url๊ฐ์ด ๋ณํ๋๋ผ๋ ํด๋น path๋ฅผ ๊ฐ๋ฅดํฌ ์ ์์ด์!
<a href="{% url "core:home" %}"></a>
<a href="{% url "rooms:detaisl" room.pk %}"></a>
from django.urls import path
from rooms import views as room_views
app_name = "core"
urlpatterns = [
path("", room_views.HomeView.as_view(), name="home"),
]
from django.urls import path
from . import views
app_name = "rooms"
urlpatterns = [
path("<int:pk>", views.room_detail, name="detail"),
]
2. About View And Templates
1) render()
- ํ์ด์ง์ ๋ด์ฉ์ด ๋ง์์ง ์๋ก ์น๋ธ๋ผ์ฐ์ ์ ๋ํ๋ผ ๋ชจ๋ ๋ด์ฉ์ HttpResponse๋ก ํ๋ํ๋ ์๋ตํ๊ธฐ ๋ณด๋ค html์ ๋ณ๋๋ก ๊ด๋ฆฌํ๊ณ content๋ฅผ ํ๋ฒ์ ์๋ตํ๋๊ฒ ๊ฐํธํฉ๋๋ค. ์ด๋ฅผ ์ํด "render()" ์ฌ์ฉํฉ๋๋ค.
from django.shortcuts import render
def all_rooms(request):
return render(request, "all_rooms.html")
- Django๊ฐ "all_rooms.html" ํ
ํ๋ฆฟ์ ์ฐพ์๋ณด๋ คํ์ผ๋, ์กด์ฌํ์ง ์๋ค๋ ์๋ฌ ๋ฉ์์ง์ธ๋ฐ์,, ์์ง "all_rooms.html" ํ
ํ๋ฆฟ์ด์ ๋ง๋ค์ง ์์๊ธฐ ๋๋ฌธ์ด์์!
- Django์ templates ์์ง์ด ๊ณ์ templates ๋๋ ํ ๋ฆฌ๋ฅผ ์ฃผ์ํ๋ค ์์ฒญ๋ html์ ์ ๋ฌํด์ฃผ๊ธฐ ๋๋ฌธ์ templates ๋๋ ํ ๋ฆฌ ๋ด์ html ํ์ผ์ ๋ง๋ค์ด ๋์ด์ผ ํด์!
- App ์์ templates ๋๋ ํ ๋ฆฌ ์์ฑ ํ "all_rooms.html"์ ๋ง๋ค์ด "Hello Django!"๋ฅผ ์์ฑํ๋ฉด htmlํ์ผ์ renderํ ์ ์๋ต๋๋ค:)
- ๐ "all_rooms.html" โ
<h1>Hello Django!</h1>
- App ๋ณ๋ก templates ๋๋ ํ ๋ฆฌ๋ฅผ ๋์ง ์๊ณ , ํ๋ก์ ํธ ๋ฐ๋ก ์๋์ templates ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด html ํ์ผ์ ๋ชจ๋ ์ด ๋๋ ํ ๋ฆฌ์์ ๊ด๋ฆฌํ๊ณ ์ถ๋ค๋ฉด, settgins.py์ ์ค์ ์ด ํ์ํด์. BASE_DIR ์๋์ templates ๋๋ ํ ๋ฆฌ์์ ํ
ํ๋ฆฟ ํ์ผ์ ์ฐพ์๋ณด๋ผ๊ณ ์๋์ฒ๋ผ ์๋ ค์ค ์ ์์ฃ !
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [os.path.join(BASE_DIR, "templates")], ๐ ์๊ธฐ์์
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
2) context
- render์ context ์์ฑ์ ํตํด html์ ๋ณ์๋ ์ ๋ฌํ ์ ์์ด์. context์ dictํํ๋ก ๋ด์ ์ ๋ฌํ๋ฉด, html์์ ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ฃ .
- DB์ ๋ชจ๋ ๋ฐฉ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ํด๋น ๋ชจ๋ธ์ importํ๊ณ , ๋ชจ๋ Object๋ฅผ dictํํ๋ก ์ ๋ฌํ๊ธฐ๋งํ๋ฉด ๋์.
- ๐ all_rooms = models.Room.objects.all()
from django.shortcuts import render
from . import models
def all_rooms(request):
all_rooms = models.Room.objects.all()
context = {"rooms": all_rooms}
return render(request, "all_rooms.html", context)
- html์์ ์ด ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋์
๋๋ฆฌ์ key๊ฐ์ ์ด์ฉํ๋ฉด ๋๋๋ฐ์, {{}}์์ ๋ณ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด, Django์ ํ
ํ๋ฆฟ ๋ณ์๋ก ๊ธฐ๋ฅํฉ๋๋ค.
- ๋ํ for๋ฌธ, if๋ฌธ์ {% %}์ผ๋ก ๊ฐ์ธ์ python ์ฝ๋์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ต๋๋ค!
{% for room in rooms %}
<h1>{{room.name}} / ${{room.price}}</h1>
{%endfor%}
3) block & extends
- Templates์ ๋ง๋ค๋ค๋ณด๋ฉด,
<head></head>
, <nav></nav>
๋ฑ ๋ฐ๋ณต์ ์ธ ์์ญ์ด ์กด์ฌํฉ๋๋ค. ๊ณตํต์ ์ผ๋ก ํ์๋กํ๋ html ์์ญ์ ๋ณ๋๋ก ๋ถ๋ฆฌํ๊ณ ์ด๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ค์ด๋ค๊ณ ์ ์ง๋ณด์๊ฐ ํธ๋ฆฌํด์ง๋๋ค.
- Python์์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ ๋ฐ์ ์ฌ์ฉํ๋ ๊ฒ ์ฒ๋ผ Django์ Templates Inheritance ๊ธฐ๋ฅ์ผ๋ก html์ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๋ต๋๋ค.
- ์ด์ ๊ฐ Templates์ ๊ณตํต์ผ๋ก ์กด์ฌํ html ์ฝ๋๋ฅผ "base.html"์ ๋ง๋ ๋ค, ๊ฐ Templates์์ Django์ Templates Inheritance ๊ธฐ๋ฅ์ผ๋ก base.html์ ์์ํ์ฌ ์ฌ์ฉํ ์ ์์ด์:)
- ๋ถ๋ชจ ํ
ํ๋ฆฟ(base.html)์์ block ์์ญ์ ์์ ํ
ํ๋ฆฟ์ html์ฝ๋๊ฐ ์ด๋ ๋ถ๋ถ์ ์์นํ ์ง๋ฅผ ๊ฒฐ์ ํด์.
- ๐ "{% block [block ์ด๋ฆ] %} {% endblock %}"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block page_title %}{% endblock page_title %}| Nbnb</title>
</head>
<body>
{% block content %} ๐ content๋ผ๋ ์ด๋ฆ์ผ๋ก block์์ญ์ ์์น์์ผ์คฌ์ด์:)
{% endblock content %}
</body>
</html>
- ์์ ํ
ํ๋ฆฟ์์๋ ์์ ๋ฐ์ ๋ถ๋ชจ ํ
ํ๋ฆฟ์ extends๋ฅผ ํตํด ๋ช
์ํ๊ณ , base.html์ block์์ญ์ด ์ฌ๋ฌ๊ฐ ์กด์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น html์ฝ๋๊ฐ base.html์ ์ด๋ค ๋ถ๋ถ์ block์์ญ์ ๊ฐ๋ฅดํค๋์ง ์ง์ ํด์ค์ผ ํฉ๋๋ค.
- ๐ {% extends "๋ถ๋ชจ ํ์ผ๋ช
.html" %}
- ๐ {% block [block์ด๋ฆ] %} ~ {% endblock [block์ด๋ฆ] %}
{% extends "base.html" %}
{% block page_title %}
Home
{% endblock page_title %}
{% block content %}
{% for room in rooms %}
<h1>{{room.name}} / ${{room.price}}</h1>
{% endfor %}
{% endblock content %}
4) include
- ๋ถ๋ชจ ํ
ํ๋ฆฟ์ธ "base.html" ๋ํ ๊ท๋ชจ๊ฐ ์ปค์ง๊ฒ ๋๋ฉด, ์ ์ง๋ณด์ํ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ถํดํ์ฌ ๋ฐ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ include๋ผ ํ๊ณ , "base.html"์
<header></header>
, <footer></footer>
๋ฑ์ ๋ณ๋์ html๋ก ๋ถ๋ฆฌ์ํจ๋ค, "base.html"๋ก ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์๋ต๋๋ค:)
- ์ฆ, html ํ์ผ์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌ์ํจ ํ include๋ก ์ฐ๊ฒฐํ์ฌ ๋ง์น ํ๋์ Template์ฒ๋ผ ์ฌ์ฉํ๋ ๊ฒ ์ด์์:)
# base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block page_name %}{% endblock page_name %}| Nbnb</title>
</head>
<body>
{% include "partials/header.html" %} ๐ header.html์ html ์ฝ๋๋ฅผ ์ฌ๊ธฐ์ ์์น์์ผ์!
{% block content %}{% endblock content %}
{% include "partials/footer.html" %} ๐ footer.html์ html ์ฝ๋๋ฅผ ์ฌ๊ธฐ์ ์์น์์ผ์!
</body>
</html>
- include๋ ํฌํจ์ํฌ ํ
ํ๋ฆฟ์๋ง ์ ์ธํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ํฌํจ์ด ๋์ด์ง๋ ํ
ํ๋ฆฟ์ ๋ณ๋๋ก ์กฐ์นํ ๊ฒ ์๋ต๋๋ค!
# partials/header.html
<header>
<a href="/">Nbnb</a>
<ul>
<li><a href="#">Login</a></li>
</ul>
</header>
# partials/footer.html
<footer>
© Nbnb
</footer>
- include๋ ํ
ํ๋ฆฟ์ผ๋ก ํ
ํ๋ฆฟ ๋ณ์๋ฅผ ์ ๋ฌํ๊ณ ์ถ๋ค๋ฉด with์ ์ด์ฉํฉ๋๋ค.
{% for room in rooms %}
{% include 'partials/room_card.html' with room=room %}
{% endfor %}