이제 웹페이지에 HTML 폼(
) 부분을 띄우고 클라이언트가 작성한 정보를 받기 위해 Template파일을 만들어주겠다.Django 탬플릿 태그
<form></form>
HTML 폼(form)
을 생성하기 위한 Django 탬플릿 언어의 탬플릿 태그 중 하나로, 한 개 이상의input 요소
를 포함하는<form></form> 태그의 요소들의 집합
으로 정의된다.<form action="/todo/" method="POST"> <input type="text"> <button type="submit"> 추가 </button> </form>
type="submit"
모든 input 요소의 데이터가 서버로 업로드action
속성
Form이 submit될 때 처리가 필요한 데이터가 전송될 URL 주소를 지정한다. 미설정시 현재 페이지 URL로 다시 제출된다.method
속성
클라이언트의 HTTP 요청 방식
[templates/todo/create.html]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>여기에서 todo 작성해주세요</h1>
<form action="/todo/create/" method="POST">
{% csrf_token %}
<input type="text" name="content" id="content">
<button type="submit">만들기</button>
</form>
</body>
</html>
Document
위 코드의
<form></form>태그
는 HTML 폼(form)을 생성하기 위한 Django 탬플릿 언어의 탬플릿 태그 중 하나이다. HTML 폼(form)은 웹 페이지에서 클라이언트로부터 정보를 입력받거나 전송하는데 사용되는 웹 요소이다.여기를 참고. (HTML 폼 참고)action 속성은 Form이 submit될 때 처리가 필요한 데이터가 전송될 URL 주소이고 Method 속성은 HTTP 요청 Method이다.
이 URL경로로 웹 서버와 웹 어플리케이션은 이를 디렉토리 경로로 해석하고 해당 디렉토리 또는 경로에 있는 디렉토리 또는 페이지를 찾는다.
이 떄, action = '/todo/'에 구분자/을 앞쪽에 붙여주지 않으면
http://127.0.0.1:8000todo/
이렇게 현재 주소 뒤에 붙게 된다.뒤에 구분자/도 꼭 붙여줘야한다. 이것은
절대 경로
를 뜻하는데 구분자/로 끝나지 않는 경로는 이 경로에 해당하는 View 함수를 호출하려고 시도할 것이다.
이 template
를 보여줄 url의 패턴을 urls.py
에 정의하고 이 template
을 불러올 View함수를 views.py
에 정의해준다.
[todo/urls.py]
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('todo/', views.todo),
path('getdata/', views.getdata),
path('todo/create/', views.create),
path('todo_create', views.todo_create)
]
[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):
return render(request, 'todo_add.html')
def getdata(request):
print(request.POST.get('added_todo1'))
print(request.POST.get('added_todo2'))
print(request.POST.get('added_todo3'))
return HttpResponse('POST 완료!')
@csrf_exempt
def create(request):
Todo.objects.create(content=request.POST["content"])
return HttpResponse('GET 요청 확인!')
def todo_create(request):
return render(request, 'todo/create.html')
이 페이지에서 만들기
버튼을 누르면 todo/views.py/create(request)
함수를 호출하고 클라이언트가 입력 필드에 작성한 값을 서버로 전달하여 데이터를 처리한다.
하나의 엔드포인트 URL로 todo의 create 뷰 함수 둘을 합치기
[todo/urls.py]
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('todo/', views.todo),
path('getdata/', views.getdata),
path('todo_create/', views.create),
]
[template/todo/todo_create.html]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>여기에서 todo 작성해주세요</h1>
<form action="/todo_create/" method="POST">
{% csrf_token %}
<input type="text" name="content" id="content">
<button type="submit">만들기</button>
</form>
</body>
</html>
[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):
return render(request, 'todo_add.html')
def getdata(request):
print(request.POST.get('added_todo1'))
print(request.POST.get('added_todo2'))
print(request.POST.get('added_todo3'))
return HttpResponse('POST 완료!')
@csrf_exempt
def create(request):
if request.method == "POST":
Todo.objects.create(content=request.POST["content"])
return HttpResponse('todo 생성!')
elif request.method == "GET":
return render(request, 'todo/create.html')
else:
return HttpResponse("Invalid request method", status=405)
이제 GET http://127.0.0.1:8000/todo_create/
요청하면 todo_create.html
를 불러오고, 만들기
버튼을 누르면 데이터베이스에 데이터가 저장되고 'todo 생성!
이 적힌 페이지가 보임.
지금까지 데이터 생성(Create)를 구현해봤다. 다음으로는 읽기(Read)를 구현해보겠다.