[Django] Todo 게시판_4 [할 일 생성 기능]

2022. 8. 24. 20:41WEB/Django

todo 사이트 만들기-4

  • Form 정의 :
  • 할 일 생성에는 제목, 내용, 중요도가 필요하므로 해당 폼 정의
from django import forms
from .models import Todo

class TodoForm(forms.ModelForm):
    class Meta:
        model = Todo
        fields = ('title', 'description', 'important')
  • html 페이지 생성:
  • csrf token : cross-site request forgery 공격 방지를 위한 토큰(없으면 에러페이지)
  • form.as_p : 뷰에서 전달 받은 객체를 <p> 태그 형식으로 표시 
<html>
    <head>
        <title>TODO LIST</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/1.0.0/css/bootstrap.min.css"/>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/bootstrap-icons/css"/>
    </head>

    <body>
        <div class="'container">
            <h1>할 일 추가</h1>
            <div class="container">
                <div class="row">
                    <div class="col-md-12">
                        <div class="card">
                            <div class="card-body">
                                <form method="POST">
                                    {% csrf_token %} {{ form.as_p}}
                                    <button type="submit" class="btn btn-primary">등록</button>
                                </form>
                            </div>

                        </div>
                    </div>
                </div>
            </div>
        </div>

    </body>
</html>
  • View 생성:
  • POST 방식일때,
  • form = TodoForm(request.POST) : request.POST에 담긴 전송 데이터를 폼 클래스에 따라 폼 객체 생성
  • if form.is_valid(): 유효성 검사
  • todo = form.save(commit=False) : 데이터를 저장하지만 데이터베이스에 저장하지 않음(commit 옵션)
  • todo.save(): commit 파라미터의 디폴트는 True 이므로 데이터베이스에 저장
  • else...return render(request,..): GET 방식이거나, 유효성 검사에서 유효하지 않을 때의 처리
def todo_post(request):
    if request.method == 'POST':
        form = TodoForm(request.POST)
        if form.is_valid():
            todo = form.save(commit=False)
            todo.save()
            return redirect('todo_list')
    else:
        form = TodoForm()
    return render(request, 'todo/todo_post.html', {'form':form})
  • URL 정의 :
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.todo_list, name='todo_list'),
    path('<int:pk>/',views.todo_detail, name='todo_detail'),
    path('post/',views.todo_post,name='todo_post'),
]
  • 완성 화면: