본문 바로가기
개발/AWS

Django 앱 만들기 - DB에 저장된 내용을 보여주자!

by ny0011 2021. 2. 4.
반응형

❗ 이제 url 링크에 해당하는 웹 페이지를 만들어보자

웹 페이지 구조를 어떻게 할 거냐면... 아래처럼 구성한다고 생각해보자

url -> 앱 -> view
---------
/, /login 등 -> core, /에서는 room의 view를 보여줄 거임
/room -> room
/user -> user

 

먼저 어떤 화면을 보여줄 지는 views.py에서 정의하면 됨

from django.shortcuts import render

def all_rooms(request):
    pass

 

그 다음 views.py를 앱 router에 들어왔을 때 url이 찾을 수 있도록 연결하는데

urls.py는 앱에 기본적으로 없어서 만들어 줘야 함.

""는 / 를 의미함. path에서 url을 지정할 때 앞에 /를 안붙여도 되는 듯.

여기서 /는 core router의 root 화면이라는 의미.

# core/urls.py

from rooms import views as room_views

app_name = "core"

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

 

앱의 router는 config/urls.py에 추가해주면 된다

namespace를 지정해주려면 core/urls.py에 app_name을 지정해줘야 함

from django.urls import path, include

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

docs.djangoproject.com/en/3.1/ref/urls/

docs.djangoproject.com/en/3.1/ref/urls/#django.urls.include

 

all_rooms에 아무것도 하지 않으면 HttpResponse를 return하지 않는다고 에러가 뜬다

The view rooms.views.all_rooms didn't return an HttpResponse object. It returned None instead.

 

❗ allrooms(request) 에서 request는 어떤 값을 갖고 있을까?

vars()와 dirs()로 변수와 메소드를 한번 살펴보면 된다

print(vars(request))
print(dirs(request))

 

HttpRequest를 만들어도 되지만 이미 있는 템플릿을 불러오는게 더 편함

def all_rooms(request):
    return HttpResponse(content="hello")

docs.djangoproject.com/en/3.1/ref/request-response/#django.http.HttpResponse

render : docs.djangoproject.com/en/3.1/ref/forms/renderers/

HttpRequest에 html 문서를 넣어서 보내는 게 더 생산적임!

 

html 파일을 Django가 인식하도록 설정해보자

request가 오면 all_rooms.html을 보여주도록 render 설정을 해주고

def all_rooms(request):
    return render(request, "all_rooms.html")

이렇게 all_rooms.html 파일을 만든다

templates/
└── all_rooms.html

Django가 templates/all_rooms.html을 인식하도록 settings.py를 수정한다

TEMPLATES = [
    {
        "DIRS": [os.path.join(BASE_DIR, "templates")],

 

❗ html 파일을 만들어보자!

jinja를 사용해서 편하게 html 문서를 만들 수 있음

 

템플릿이 될 html에 block을 만들어준다

<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title> {% block page_name %}{% endblock %} | Nbnb</title>
</head>
<body>

{% block content %}{% endblock %}

&copy; YN0011
</body>
</html>

 

템플릿 html을 가져올 땐 extends를 사용하고

block은 템플릿에 쓴 것 그대로 가져옴

{% extends 'base.html' %}

{% block page_name %}
    Home
{% endblock %}

{% block content %}

    {% for room in rooms %}
        <h1>{{room.name}} / ${{room.price}}</h1>
    {% endfor %}

{% endblock content %}

 

 

docs.djangoproject.com/en/3.1/ref/request-response/

댓글