[Django] ORM with view 실습
# models.py
from django.db import models
class todos(models.Model):
title = models.CharField(max_length=80)
content = models.TextField(null=True)
completed = models.BooleanField(default=False)
priority = models.IntegerField(default=3)
created_at = models.DateField(auto_now_add=True)
deadline = models.DateField(null=True)
# todos/urls.py
from django.urls import path
from . import views # views 임포트
urlpatterns = [
# 할 일 생성 New
path('new/', views.todo_new, name='todo_new'),
# 할 일 생성 Create
path('create/', views.todo_create, name='todo_create'),
]
# todos/views.py
from django.shortcuts import render, get_object_or_404
from . models import todos # todos 임포트
# 예전에 throw/catch와 같은 상황이라고 생각할 것
# todo_new에서 데이터를 보내면
# todo_create에서 데이터 받기
def todo_new(request):
return render(request, 'todo_new.html')
def todo_create(request):
title = request.GET.get('inputText')
content = request.GET.get('inputContent')
priority = request.GET.get('inputNumber')
deadline = request.GET.get('inputDate')
# creates변수에 새로운 todos 모델 인스턴스 생성
# 이때 입력받은 데이터를 이용하여 todos모델 인스턴스 title,content,priority, deadline필드에 저장
creates = todos(title=title, content=content,priority=priority, deadline=deadline)
# creates를 데이터베이스에 저장
creates.save()
# todos 모델에서 모든 인스턴스 조회해서 creates_list에 저장
creates_list = todos.objects.all() # 데이터 전체 조회
# 데이터 전달할 딕셔너리
context = {
'inputText': title,
'inputContent': content,
'inputNumber': priority,
'inputDate': deadline,
}
return render(request, 'todo_create.html', context)
[질문 1] title = request.GET.get('inputText')의 title 변수와 context 딕셔너리의 title은 같은 거야?
[답변] yes
title = request.GET.get('inputText') 코드는 GET 방식으로 전달된 'inputText' 파라미터 값을 'title' 변수에 할당한 것.
context 딕셔너리의 'inputText' 키에 'title' 변수 값을 할당하여 템플릿(todo_create.html)에서 {{ inputText }} 변수를 사용할 수 있게 함
[질문 2] html파일에서 {{ inputText }}라고 코드를 작성할 때 {{ inputText }}는 title = request.GET.get('inputText')여기 inputText에서 가져온거야?
[답변] yes
{{ inputText }}는 context 딕셔너리의 inputText 키에 할당된 값, 즉 title변수 값을 출력함
이 값은 [질문1]에서와 같이 title = request.GET.get('inputText') 코드는 GET 방식으로 전달된 'inputText' 파라미터 값임
[질문 3] creates = todos(title=title, content=content, priority=priority, deadline=deadline) 이 코드에서 title=title이잖아. todos에서 생성한 title을 위에서 정의한 title = request.GET.get('inputText')를 오른쪽에 할당하는 거야?
[답변] yes
creates = todos(title=title, content=content, priority=priority, deadline=deadline) 이 코드는 새로운 todos 객체를 생성하고,데이터베이스에 저장하는 역할을 함.
왼쪽의 title, content, priority, deadline은 todos모델에서 정의된 필드
오른쪽의 title, content, priority, deadline은 title = request.GET.get('inputText') 여기서 사용된 변수!
creates 변수에 이러한 필드들을 가진 새로운 인스턴스가 생성됨
[질문 3] creates_list = todos.objects.all() 이 코드를 사용하는 이유는 뭐야?
[답변]
creates_list = todos.objects.all() 이 코드는 todos 모델에 있는 모든 객체를 가져와 creates_list 변수에 할당하는 역할을 함.
이 코드를 사용하는 이유는 모든 todo 항목을 가져와서 create_list에 저장한 후 render함수를 통해 todo_create.html 템플릿으로 전달하기 위함.
이렇게 해야 새로운 todo 항목을 추가할 때마다 화면에 모든 항목이 보여지는 것을 보장할 수 있다
db.splite3의 todos_todos 테이블에 데이터가 저장되는 이유는 save() 메서드를 호출하여 데이터를 저장했기 때문!
todos.objects.all() 코드를 실행하면 해당 테이블에 저장된 모든 데이터를 가져올 수 있음
todos.objects.all()를 실행하지 않은채 진행한다면 입력, 저장, 출력 다 되지만
이전에 저장된 데이터를 가져올 수 없음!
이번 실습에서는 꼭 필요한 코드는 아니지만 실무에서는 이전에 저장한 데이터를 불러올 일이 많기 때문에 해당 코드를 작성하는 것이 중요!
예를 들어, 할일 목록 애플리케이션을 개발한다고 가정해보자. 사용자가 생성한 할일 목록 데이터는 데이터베이스에 저장된다. 이후에 사용자가 애플리케이션을 다시 실행하여 이전에 작성한 할일 목록을 볼 수 있어야 한다. 이때, 데이터베이스에서 이전에 작성한 할일 목록 데이터를 불러와야 한다. 여기서 필요한 코드가 <모델 클래스명.objects.all()> 코드이다. objects는 모델 객체를 검색, 수정, 및 삭제하는 메소드를 가지고 있는 manager 객체이다. => 따라서 todos모델의 모든 객체를 가져온다고 볼 수 있다.
# todo_new.html
{% extends 'base.html' %}
{% block content %}
<form action="{% url 'todo_create' %}" method="GET" class="mt-5 ms-5">
<div class="w-25 p-3">
<label for="inputText" class="form-label">할 일 제목</label>
<input type="text" class="form-control" id=" inputText" name="inputText" />
</div>
<div class="w-25 p-3">
<label for="inputContent" class="form-label">할 일 내용</label>
<textarea
type="text"
class="form-control"
id="inputContent"
name="inputContent"
></textarea>
</div>
<div class="w-25 p-3">
<label for="inputNumber" class="form-label">우선순위</label>
<input
type="number"
class="form-control"
id="inputNumber"
name="inputNumber"
/>
</div>
<div class="w-25 p-3">
<label for="inputDate" class="form-label">마감기한</label>
<input type="date" class="form-control" id="inputDate" name="inputDate" />
</div>
<div class="w-25 p-3">
<button type="submit" class="btn btn-primary">할 일 생성</button>
</div>
</form>
{% endblock content %}
# todo_create.html
{% extends 'base.html' %}
{% block content %}
<div class="mt-5 ms-5">
<h1>Todo List</h1>
# views.py에서 context 딕셔너리에 저장한 데이터를 키를 통해 값을 가져옴
<p>Todo: {{ inputText }}</p>
<p>Content: {{ inputContent }}</p>
<p>Priority: {{ inputNumber }}</p>
<p>Deadline: {{ inputDate }}</p>
<br />
<a href="{% url 'todo_new' %}">[back]</a>
</div>
{% endblock content %}