일기 대신 코드 슬쩍

[백엔드][장고][Django] Chapter #9 본문

Backend/Django

[백엔드][장고][Django] Chapter #9

코코자 2023. 7. 17. 20:07

#9.0 Views

  • 이 챕터에서는 URL, View, 템플릿에 대해 알아볼 것임
  • config의 urls.py로

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

urlpatterns = [
    path('admin/', admin.site.urls),
]
  • user가 admin/으로 접근하면, admin.site.urls 이 함수를 실행하는 것임
  • 우리만의 함수를 만드는 방법에는 두 가지가 있는데
  1. config 폴더 내부의 urls.py에 모든 url추가하기 (귀찮겠지? 근데 이해하기 쉬움)
  1. 분할 정복 어플리케이션마다 urls.py 추가하기

  1. config 폴더 내부의 urls.py에 모든 url추가하기
  • view는 유저가 특정 url에 접근했을 때 작동하게 되는 함수임
  • 그리고 views.py같은 경우 이름 딱히 상관없음 바꿔도 됨
  • 예제로 rooms를 입력했을 때, hello를 반환하도록 해볼게
def say_hello():
    return "hello"

이 함수를 rooms의 views.py에 넣고

from rooms import views as room_views #추가함

urlpatterns = [
    path('admin/', admin.site.urls),
    path("rooms", room_views.say_hello) # 추가함
]
  • config의 url에 해당 코드 추가

  • 아니 다시 해봐
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def say_hello(request):
    return HttpResponse("hello!")
  • 이게 rooms의 view
  • request안에 모든 정보가 다 들어 있음 , 함수정의할 때 꼭 필요함

#9.1 Include

  1. 분할 정복 어플리케이션마다 urls.py 추가하기
  • cofig url에 다음과 같이 작성
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path("rooms/", include("rooms.urls"))
]
  • rooms의 urls에 다음과 같이 작성
from django.urls import path
from . import views
urlpatterns = [
    path("", views.say_hello),
    ]

#9.2 URL Arguments

  • url에서 변수를 받으려면 어떻게 해야 할 지 알아볼 것임
  • path안에 url parameter의 타입을 확인해주기도 함
  • rooms의 url
from django.urls import path
from . import views
urlpatterns = [
    path("", views.see_all_rooms),
    path("<int:room_id>", views.see_one_room),

    ]

  • rooms의 views
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def see_all_rooms(request):
    return HttpResponse("see all rooms")

def see_one_room(request, room_id):
    return HttpResponse(f"see room with id: {room_id}")

#9.3 render

  • 템플릿을 렌더링하는 방법
  • 어떻게 유저한테 HTML을 보여주는지, 어떻게 DB의 데이터를 HTML에 넣는지
  • 현재 views에서 모든 방을 보는 기능, 한 개의 방을 보는 기능이 각각 필요함
  • views를 다음과 같이 수정
from django.shortcuts import render
from django.http import HttpResponse
from .models import Room

# Create your views here.
def see_all_rooms(request):
    rooms = Room.objects.all()
    return render(request, "all_rooms.html")
def see_one_room(request, room_id):
    return HttpResponse(f"see room with id: {room_id}")
  • 그리고 rooms안에 templates이라는 폴더 생성
  • 그 안에 all_rooms.html 생성
  • <h1>Hi! All rooms here!</h1> 이렇게 적고 서버 다운시켰다가 다시 런하면 잘 작동함
from django.shortcuts import render
from django.http import HttpResponse
from .models import Room

# Create your views here.
def see_all_rooms(request):
    rooms = Room.objects.all()
    return render(request, "all_rooms.html",
                  {"rooms": rooms})
def see_one_room(request, room_id):
    return HttpResponse(f"see room with id: {room_id}")
  • views에서 이런식으로 return값을 설정해주고 html파일에서 {{rooms}}하면 key에 해당하는 value값을 리턴함

#9.4 Django Templates

  • html의 작동원리: 장고가 해당 템플릿을 가져다가 변수를 우리가 설정해준 값으로 바꿔줌
  • html안에
<h1>Hi! All rooms here!</h1>

<ul>
    {% for room in rooms %}
    <li>{{room.name}}</li>
    {% endfor %}
</ul>

이렇게 작성하고 새로고침하면

  • 우리가 가진 room을 다 보여줌
<h1>Hi! All rooms here!</h1>

<ul>
    {% for room in rooms %}
    <li>{{room.name}}<br/>
        {% for amenity in room.amenities.all %}
        <span>-{{amenity.name}}<br /></span>
        {% endfor %}
    </li>
    {% endfor %}
</ul>
  • html이렇게 수정하면
  • 짠~ 각 room별로 가진 amenity에 대해서도 볼 수 있음

  • html에 링크도 추가해줄 것임
<h1>Hi! All rooms here!</h1>

<ul>
    {% for room in rooms %}
    <li>
      <a href="/rooms/{{room.pk}}">
        {{room.name}}<br />
        {% for amenity in room.amenities.all %}
        <span>-{{amenity.name}}<br /></span>
        {% endfor%}</a
      >
    </li>
    {% endfor %}
  </ul>
  • 이렇게 작성하고

저기 숫자 1부분에 번호를넣으면 해당 링크로 이동하는 개념

#9.5 DoesNotExist

  • 한 개의 방을 위한 코드를 작성해볼 것임
  • view를 다음과 같이 수정
from django.shortcuts import render
from django.http import HttpResponse
from .models import Room

# Create your views here.
def see_all_rooms(request):
    rooms = Room.objects.all()
    return render(request, "all_rooms.html",
                  {"rooms": rooms})
def see_one_room(request, room_pk):
    room = Room.objects.get(pk=room_pk)
    return render(request,"room_detail.html",{'room':room,})
  • url도 다음과 같이 수정
from django.urls import path
from . import views
urlpatterns = [
    path("", views.see_all_rooms),
    path("<int:room_pk>", views.see_one_room),

    ]
  • room_detail.html생성하고 다음과 같이 작성
    {% if not not_found %}
    <h1>{{room.name}}</h1>
    <h3>{{room.country}}/{{room.city}}</h3>
    <h4>{{room.price}}</h4>
    <p>{{room.description}}</p>
    <h5>{{room.category.name}}</h5>
    {% else %}
    <h1>404 not found</h1>
    {% endif %}

#9.6 Django vs React

  • 왜 장고에서 더이상 템플릿을 만들지 않을까?
  • 장고는 다이나믹한 html만들기 아주 좋음
  • 템플릿 랜더링하고 데이터 넘겨주기 좋음
  • 그래서 프론트는 react 사용할 것임
  • 하지만 난 일단 장고만 배울거니까… 스킵
  • 다음 섹션에서 장고의 REST 프레임 워크 쓸 것임