Django(장고) 데이터 읽기 READ

장현웅·2023년 9월 5일
0

'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들이 페이지에 뜨고 있다.

0개의 댓글