본문 바로가기
Develop/Django(Project)

3. ToDoApp / 생성 기능 만들기

by 보보트레인 2023. 9. 21.

todo 생성은 제목, 설명, 중요도를 입력해야 하기 때문에 입력 폼이 필요합니다. 따라서 1에서 미리 세팅해둔 todo/forms.py의 내용을 작성할 예정이다.

 

1. Todo 생성 템플릿 만들기

todo/forms.py 에는 다음과 같이 내용을 작성한다.

from django import forms
from .models import Todo

class TodoForm(forms.ModelForm):
    class Meta:
        model = Todo
        fields = ('title', 'description', 'important')

이젠 템플릿을 작성할 예정인데, todo_post.html 로 템플릿을 만든다.

※  form.as_p 의 형태로 작성하면 태그 꼴로 템플릿에 폼이 자동으로 생성되는 기능 이용하기!

<html>
    <head>
        <title>TODO 목록 앱</title>
        <link
            rel="stylesheet"
        />
    </head>
    <body>
    <div class="container">
        <h1>TODO 추가하기</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>
</html>

2. Todo 생성 뷰 만들기

POST요청을 처리할 수 있어야 함. 

POST요청이 들어왔을 때는 폼을 검증하고 데이터를 저장할 수 있도록 하며, 

GET요청이 들어왔을 때는 폼을 포함안 템플릿 페이지를 보여주면 된다.

from django.shortcuts import render, redirect
from .models import Todo
from .forms import TodoForm

# Create your views here.
def todo_list(request):
    todos = Todo.objects.filter(complete=False)
    return render(request, 'todo/todo_list.html', {'todos': todos})

def todo_detail(request, pk):
    todo = Todo.objects.get(id=pk)
    return render(request, 'todo/todo_detail.html', {'todo': todo})

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})

이후 todo_list.html의 버튼에 링크를 넣어줘야 한다.

<a href="{% url 'todo_post' %}"><i class="bi-plus"></i>Add Todo</a>

설명 : GET 요청에 대해, 혹은 POST 요청 중 폼의 값이 유효하지 않을 때, 마지막 render가 리턴퇸다. 

이는 다시 TodoForm작성 페이지로 원복되도록 form을 전달한다.

 

만약 정상적인 POST요청에 대해서는 form데이터를 불러와 저장하고 다시 todo_list페이지로 이동시킨다.

 

3.Todo생성 URL 연결하기

from django.urls import path
from . import views

urlpatterns = [
    path('', views.todo_list, name='todo_list'),
    path('<int:pk>/', views.todo_detail, name='todo_detail'),
    path('post/', views.todo_post, name='todo_post'),
]

순서요약 :  todo_list.html에서 Add Todo 버튼 클릭 시, URL에서 post/ 파라미터를 타고 views의 todo_post함수로 이동.

잘 작성 시, 데이터 저장하고 todo_list로 이동하고 작성이 제대로 안되면 다시 작성페이지로 원복.

 

<결과화면>

만약 적절한 데이터를 담지 않고 등록 버튼을 누르게 되면

다음과 같은 경고 창이 뜬다.

반응형