#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 이 함수를 실행하는 것임
- 우리만의 함수를 만드는 방법에는 두 가지가 있는데
- config 폴더 내부의 urls.py에 모든 url추가하기 (귀찮겠지? 근데 이해하기 쉬움)
- 분할 정복 어플리케이션마다 urls.py 추가하기
- config 폴더 내부의 urls.py에 모든 url추가하기
- rooms내부에 views.py 추가
- 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
- 분할 정복 어플리케이션마다 urls.py 추가하기
- rooms 안에 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 프레임 워크 쓸 것임
'Backend > Django' 카테고리의 다른 글
[백엔드][Django][장고 채널스] Section0. Overview (0) | 2023.07.23 |
---|---|
[백엔드][장고][Django] Chapter #10 (0) | 2023.07.18 |
[백엔드][장고][Django] Chapter #8 (0) | 2023.07.17 |
[백엔드][장고][Django] Chapter #7 (0) | 2023.07.17 |
[백엔드][장고][Django] Chapter #6 (0) | 2023.07.15 |
Uploaded by Notion2Tistory v1.1.0