Terry Very Good

[Django Todolist 프로젝트 2] 완료한 항목 보이지 않게 하는 법(DB 삭제 없이) 본문

프로그래밍/(WEB) DJANGO

[Django Todolist 프로젝트 2] 완료한 항목 보이지 않게 하는 법(DB 삭제 없이)

테리베리 2020. 12. 17. 16:12
728x90
반응형

아래 Web에서 '완료'버튼 클릭 시, 해당 항목 보이지 않게 하는 법

        (1). Model(DB Table)에 isDone(Boolean Field) 컬럼 추가

              - models.py

from django.db import models

# Create your models here.
class Todo(models.Model):
    content = models.CharField(max_length = 255)
    isDone = models.BooleanField(default=False)

                하고 난 뒤,
                python manage.py makemigrations
                python manage.py migrate

        (2). 개발 로직:

             '완료' 누르면 해당 Data는 isDone이 True가 되고, isDon이 True인 Data는 출력되지 않도록 만든다.

              - 1). '완료' 버튼 클릭 시 doneTodo()가 실행되도록 index.html의 form action에 './doneTodo' 입력
              - 2). urls.py에 ./doneTodo에 대한 path 입력
              - 3). '완료' 버튼 클릭 시, 해당 Data의 isDone은 True가 되도록 Views.py에 doneTodo 함수 생성
              - 4). 더불어 index.html이 새로고침되며, isDone이 True인 Data는 출력이 되지 않도록 HTML 내부 if문 구성

        (3). 코드

              - index.html 내부 

            <div class="toDoDiv">
                <ul class="list-group">
                    {% for todo in todos %}
                        {% if todo.isDone == False %}
                            <form action="./doneTodo/" method="GET">
                                <div class="input-group" name='todo1'>
                                    <li class="list-group-item">{{todo.content}}</li>
                                    <input type="hidden" id="todoNum" name="todoNum" value="{{todo.id}}"></input>
                                    <span class="input-group-addon">
                                        <button type="submit" class="custom-btn btn btn-danger">완료</button>
                                    </span>
                                </div>
                            </form>
                        {% else %}
                        {% endif %}
                    {% endfor %}
                </ul>
            </div>


              - urls.py 내부

from django.urls import path
from . import views

urlpatterns = [
    path('',views.index, name='index'),
    path('createTodo/', views.createTodo, name='createTodo'),
    path('doneTodo/', views.doneTodo, name='doneTodo')
]


              - views.py 내부

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from .models import *

# Create your views here.
def index(request):
    todos = Todo.objects.all()	# Todo 테이블의 모든 데이터를 가져와서
    content = {'todos': todos}  # 딕셔너리형태로 content에 넣는다
    return render(request, 'my_to_do_app/index.html', content)

def createTodo(request):
    user_input_str = request.POST['todoContent']	# name값이 todoContent였지!
    new_todo = Todo(content = user_input_str)		# DB의 Todo테이블에 쓰고,
    new_todo.save()									# 저장!
    return HttpResponseRedirect(reverse('index'))
    #return HttpResponse("create Todo를 할 거야!=>"+user_input_str)

def deleteTodo(request):
    done_todo_id = request.GET['todoNum']
    print("완료한todo의 id", done_todo_id)
    todo = Todo.objects.get(id=done_todo_id)
    todo.delete()
    return HttpResponseRedirect(reverse('index'))

def doneTodo(request):
    done_todo_id = request.GET['todoNum']
    print("완료한 todo의 id",done_todo_id)
    todo = Todo.objects.get(id = done_todo_id)
    todo.isDone = True
    todo.save()
    return HttpResponseRedirect(reverse('index'))

 

728x90
반응형