장고 서버 활성화하기(시작하기)
응답 : 로켓 페이지
Django 프로젝트를 생성한 후 바로 서버를 실행하면 로켓 페이지가 등장한다.
언어와 시간 설정
settings.py에서 설정한다.
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
from django.contrib import admin
from django.urls import path
from articles import views
urlpatterns = [
path('admin/', admin.site.urls), # 기본 제공 admin
path('index/', views.index, name='index'), # 새로 만들 URL
]
view를 import해서 가져와야한다.
path 함수 사용
/
를 끝에 안붙여도 되지만 입력할 땐 URL에 /
를 무조건 붙여줘야 한다.naming url patterns
<a href="{% url '뷰함수이름' %}"></a>
admin 페이지가 기본적으로 제공되어 있다.
주소로 들어가서 admin을 뒤에 붙여주고 enter를 누르면 로그인 페이지가 등장한다.
URL 주소를 변수로 사용하는 것
URL의 일부를 변수로 지정하여 view 함수의 인자로 넘길 수 있음
str, int 많이 사용(str은 생략 가능하다.)
url 경로에 넣어주는 경우 views.py에서 인자로 받을 수 있다.
path('dinner/<menu>/<int:number>/', views.dinner),
app의 view함수가 많아지면 path()가 많아지니 각 app에 url을 작성한다.
프로젝트 urls.py
from django.contrib import admin
from django.urls import path, include
# 각 앱의 urls.py로 연결시킬 경우 include를 import하여 사용
urlpatterns = [
path('admin/', admin.site.urls),
path('<app명>/', include('<app명>.urls'), name='<app명>'),
]
각 앱에 url.py 생성
from django.urls import path
from . import views
app_name = '앱이름'
urlpatterns = [
path('경로/', views.뷰함수이름, name='뷰함수이름'),
# Variable Routing
path('<int:pk>/', views.create, name='create'),
path('dinner/<menu>/<int:number>/', views.dinner),
]
templates에서 Django Template Tag 중 하나인 url 태그를 사용해 path() 함수에 작성한 name을 사용
<a href="{% url '앱이름:뷰함수이름' %}"></a>
필수 인자 request : 요청 객체
render를 이용
views.py
from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, 'index.html')
def greeting(request):
context = {
'name' : 'Alice',
}
return render(request, 'greeting.html', context)
def <template 명>(request):
context = {
'foods': foods,
'info': info,
}
return render(request, '<app 명>/<template 명>.html', context) # app폴더를 안에 넣어줬을 경우 app 명을 앞에 붙이고 and /
def dinner(request, menu, number):
context = {
'menu': menu,
'number': number,
}
return render(request, 'dinner.html', context)
from django.shortcuts import redirect, render
def create(request):
title = request.POST.get('title')
content = request.POST.get('content')
article = Article(title=title, content=content) # model에서 배운다!!
article.save()
return redirect('articles:index')
# return redirect('articles:detail', article.pk) # variable routing이 있는 url로 이동하는 경우
Django template에서 사용
장고 Template은 템플릿은 HTML을 프로그래밍 구조로 사용할 수 있다. (if , for)
{{ variable }}
중괄호 사이에 공백을 하나씩 넣어준다. (장고 style)
render()를 사용하여 view.py에서 정의한 변수를 template 파일로 넘겨 사용하는 것
변수명은 영어, 숫자와 밑줄(_) 조합으로 구성, 밑줄로 시작은 X(공백이나 구두점 문자 또한 X)
dot(.)를 사용하여 변수 속성에 접근
render의 세번째 인자로 딕셔너리 형태로 넘겨준다. => key에 해당하는 문자열이 template에서 사용 가능한 변수명이 됨
<!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>Document</title>
</head>
<body>
<p>안녕하세요 저는 {{ info.name }}입니다.</p
<p>제가 가장 좋아하는 음식은 {{ foods }}입니다.</p>
<p>저는 사실 {{ foods.0 }}를 가장 좋아합니다.</p>
</body>
</html>
출력!
안녕하세요 저는 Alice입니다.
제가 가장 좋아하는 음식은 ['apple', 'banana', 'coconut']입니다.
저는 사실 apple를 가장 좋아합니다.
{{ variable|filter }}
{{ name|lower }}
{% Tag %}
출력 텍스트를 만들거나, 반복 또는 논리를 수행하여 제어 흐름을 만드는 등, 변수보다 복잡한 일들을 수행
일부 태그는 시작과 종료 태그가 필요
<p>메뉴판</p>
<ul>
{% for food in foods %}
<li>{{ food }}</li>
{% endfor %}
</ul>
다른 url로 연결할 때에 url 태그를 사용한다.
,
로 url과 값을 함께 적는다. (variable routing)
<a href="{% url 'articles:detail' article.pk %}">DETAIL</a>
주석 처리
{# 이것은 한 줄 주석입니다. #}
{% comment %}
<p>1</p>
<p>1</p>
<p>1</p>
{% endcomment %}
{# ctrl /로 여러 줄 처리한다 #}
<form action="{% url 'articles:create' %}" method="POST">
{% csrf_token %}
여러 앱의 templete의 이름이 겹치는 경우 settings.py -> INSTALLED_APPS에 적힌 순서대로 렌더링 된다.
각 app의 template에 그 app의 이름의 폴더를 만들어 거기에 넣어준다!! 그럼 경로를 다르게 지정할 수 있다.
views.py의 함수들의 render함수에서 "app명/html"으로 넣어주기만 하면된다.
코드의 작성 순서
URL -> VIEW -> TEMPLATE 순서
데이터의 흐름에 맞춰서 작성하는 것이다! (길을 잃지 말자!)