해리의 데브로그

Django 02 - MTV Pattern, 템플릿 변수, Variable Routing

|

Django 기본 Process (MTV Pattern)

1. urls.py - url 패턴 정의

  • urlpatterns 라는 리스트안에 주소를 하나하나씩 쌓아 넣음.
    • 첫번째 인자: URL 주소를 입력
    • 두번째 인자: 해당 URL 주소로 요청이 들어올 때 views.py 내 연결할 함수를 입력함. 이 함수는 어플리케이션 폴더 내 views.py에 작성되어있으므로 import 해와야함 예) from pages import views

아래 코드에서 입력한 내용의 의미는 다음과 같다. index/ 라는 url로 요청이 들어온, 두번째 인자의 내용에 따라, views.py 내 index 함수를 실행함. views.py이 함수를 통해 return 되는 값을 반환하는데, 그 결과 값은 index.html을 render 하는 것임

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

urlpatterns = [
    path('index/', views.index),
    path('admin/', admin.site.urls),
]

2. views.py - 함수 정의

  • urls.py를 통해 정의된 urlpattern에 따라, 요청이 들어오면 어떤 것을 반환할건지에 대한 기본 로직을 작성하는 파일임. 함수로 정의되며, 함수의 인자로 request를 받음
  • 함수 render첫번째 인자로 request를 넘겨주고, 어떠한 html 을 보여줄건지를 설정함.
  • return 으로 반환되는 render 함수의 첫 번째 인자 request는 위 index 함수의 첫번째 인자와 동일함.
from django.shortcuts import render

def index(request):
    return render(request, 'index.html')

3. Template - 웹 페이지(html) 구현

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1>Index입니다!</h1>
</body>
</html>

Summary

  1. url.py에서 url의 pattern을 정의함. 사용자 또는 정해진 코드에 따라 특정 url이 요청되면, 정의된 url pattern에 따라 views.py내 특정 함수를 호출함.
  2. views.py 내에서 함수를 작성하여, 작성된 함수에 따라 return 값을 줌. 일반적으로는 render & redirect 함수를 이요하여 특정 html을 호출거나 다른 웹페이지로 연결시킴.
  3. render 된 html 파일을 열어서 사용자에게 보여줌


템플릿 변수

HTML 문서에 views.py 내 정의한 변수를 넘기는 것을 템플릿 변수라고 함.

예시로, 저녁 메뉴를 random으로 뽑혀서 보여주는 페이지를 생성해보자.

  • urls.py
    • 페이지를 접근하는 주소를 urls.py에 생성.
    • “기본주소/dinner” 이라는 url 주소를 사용자가 호출(요청;request)하면 views 폴더 내 dinner 함수가 실행됨.
from django.contrib import admin
from django.urls import path
from pages import views

urlpatterns = [
    path('dinner/', views.dinner),
    path('admin/', admin.site.urls),
]
  • view.py
    • random 함수를 쓰기 위해 함수를 import 해움
    • random,.choice의 결과 값을 pick 이라는 변수에 저장하여, render 의 3번째 인자로 넘김
    • Django에서는 템플릿변수를 넘길때, 딕셔너리의 형태로 넘겨야함.
      • 'dinner' : Dictkey 이며, 이 값이 html 문서로 넘김
      • 딕셔너리에서 key를 호출하면 value값이 반환되는 파이썬 문법의 매커니즘을 사용함.
from django.shortcuts import render
import random

def dinner(request):
    menu = ["족발","햄버거","치킨","초밥"]
    pick = random.choice(menu)
    return render(request, 'dinner.html', {'dinner': pick})    
  • dinner.html
    • 템플릿 변수를 html 파일에서 사용할 때는 반드시 이중 중괄호로 감싸줘야함.
    • views.py에서 지정한 render 함수의 3번째 인자 {'dinner': pick} 에서 key 값인 dinner를 이중 중괄호안에 넣으면, dictvalue값인 pick이 반환됨.
    • pickrandom.choice의 결과값이 저장된 변수임
<!-- 중략 -->
<body>
    <h1>오늘 저녁은 </h1>
</body>
<!-- 변수는 반드시 이중 중괄호로 감싸 줄 것! 변수는 의 형태임 -->


Variable routing

URL 주소자체를 변수로 사용하는것을 의미함. URL 주소로 들어오는 값을 변수로 지정하여, views.py 내 함수의 인자로 넘겨줌. 변수값에 따라 다른 페이지를 연결 시킬 수 있음.

  • urls.py
    • 페이지를 접근하는 주소를 urls.py에 생성.
    • 기본적으로 < > 의 형태로 variable routing을 정의함
      • <str:name> 은 자료의 형태를 string(문자열)으로 제한한다는 의미임.
      • <> 내 변수가 views.py 내 함수의 인자로 할당됨
    • 예를들어, 기본주소/hello/harry 와 같은 예시의 주소를 요청하면, name 변수의 값으로 harry가 할당되며, 이 값을 views.py 및 render 되는 html 파일에서 사용 할 수 있게 됨.
urlpatterns = [
    path('hello/<str:name>/', views.hello),
    path('admin/', admin.site.urls),
]
  • view.py
    • variable routing으로 할당된 변수를 인자로 넘기고, 그 인자가 다시 템플릿 변수로 사용함.
    • 여기서 템플릿 변수를 정의하는 render함수의 3번째 인자 {'name' : name} 를 유심히 살펴보자
      • key : html 파일에서 사용하는 변수 명
      • value : variable routing으로 들어오는, 제 주소창에 입력되는 hello/<str:name> 의 name이다 (hello함수의 2번째 인자)
def hello(request, name):
    return render(request, 'hello.html', {'name': name})
  • hello.html
<body>
    <h1>안녕, !</h1>
</body>

Comments