'todo_create'에서 저장한 todo들을 한 페이지에서 보고 싶다.
Django 모델을 사용하여 데이터베이스에서 데이터을 가져오는 메서드
from 앱.models import # 앱의 데이터 모델 클래스
앱의 모델 클래스.object.get() # 1개 가져옴
앱의 모델 클래스.object.all() # 전부 가져옴
처음에 url과 view함수 연습을 위해 썼던 'todo/'와 'todo(request)', 'todo_add.html'를 메인 URL과 페이지로 하려고 한다.
'todo/'로 클라이언트가 GET 요청을 하면 'todo(request)' 함수가 데이터베이스의 모든 데이터를 가지고 와서 'todo_list.html'에 띄워보자.
[todo/urls.py]
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('todo/', views.todo),
]
[todo/views.py]
from django.http import HttpResponse
from django.shortcuts import render
from todo.models import Todo
from django.views.decorators.csrf import csrf_exempt
def todo(request):
if request.method == "GET":
todos = Todo.objects.all()
print(todos)
return render(request, 'todo/todo_list.html')
else:
return HttpResponse("Invalid request method", status=405)
[templates/todo/todo_list.html]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>알렉스의 ToDo List</title>
</head>
<body>
<h1> Alex's ToDo List </h1>
</body>
</html>
데이터베이스에서 가져온 데이터들을 변수에 넣어주었고, 'todo/'로 GET
요청을 하면 'todo_list.html'을 화면에 띄워주는데까지 했다.
이제 데이터베이스에서 가져온 데이터들을 템플릿에 넣어서 출력하고 싶다.
render
함수와 템플릿 언어를 사용하면 적용이 가능하다.
[todo/views.py/todo(request)]
def todo(request):
if request.method == "GET":
# todos = Todo.objects.all() # 사실 데이터베이스에서 모든 데이터를 가져오는 all()은 잘 쓰지 않는다. 한번에 모든 데이터를 가져와서 활용하는 경우는 드물기 때문이다.
todo1 = Todo.objects.get(id=1)
# todo1 = Todo.objects.get(id=todo_id) # 나중에 페이지를 런칭하면 유용할 것. 예를 들어 ___님이 작성하신 게시물
todos = Todo.objects.values('content').all() # 데이터베이스에서 하나의 필드값을 가져오는 경우를 여러번 정의해서 활용하는 방법이 더 효율적이다.
# print(todos)
context = { # 가져온 데이터 객체들을 모두 context에 담아서 html에 같이 담아서 반환할 수 있다.
"todo1" : todo1,
"todos" : todos
}
return render(request, 'todo/todo_list.html', context)
else:
return HttpResponse("Invalid request method", status=405)
여기서 context
는 Django 템플릿 시스템을 통해 템플릿에서 사용할 데이터를 포함하는 Python 사전(dictionary) 객체이다.
render 함수를 통해 템플릿을 렌더링할 때, 이 context 데이터를 함께 전달하여 템플릿에서 해당 데이터를 사용할 수 있게 한다. "todos"라는 키(key)
로 todos 변수의 값
을 포함하고 있다.
템플릿에서 context를 사용하려면, 템플릿 파일에서 {% for todo in todos %}
와 같은 형태로 데이터를 참조할 수 있다.
[templates/todo/todo_list.html]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>알렉스의 ToDo List</title>
</head>
<body>
<h1> Alex's ToDo List </h1>
<ul>
첫 번째 todo는 {{ todo1.content }}
{% for todo in todos %}
<li>
<div>
{{ todo.content }} # content는 모델 데이터(모델 클래스의 인스턴스)의 속성값
</div>
<div>
{{ todo.updated_at }}
</div>
</li>
{% endfor %}
</ul>
</body>
</html>
지금까지 작성했던 todo들이 페이지에 뜨고 있다.