Develop/Django

Django - To Do List 만들기

Gr00t 2021. 2. 1. 11:49

프로젝트 생성

  • 먼저 앱을 구동할 Django 프로젝트를 설치한다.
    $ django-admin startproject TodoList
  • django 명령어를 실행하기 위해 manage.py가 있는 프로젝트 폴더 안으로 이동한다.
    $ cd TodoList
  • runserver명령을 통해 프로젝트를 실행해본다.
    $ python manange.py runserver
Django 기본 실행화면

앱 생성 및 등록

  • 만들고자 하는 앱(Todo_app)을 생성한다.
    $ python manage.py startapp todo_app
  • 생성된 앱을 프로젝트에 등록한다.

    프로젝트 폴더에 settings.py에서 INSTALLED_APPS에 앱 이름을 추가한다. (쉼표 주의)

    INSTALLED_APPS = [
        ...
        'django.contrib.staticfiles',
        'todo_app'
    ]
  • 생성된 앱의 url을 찾아갈 수 있도록 프로젝트에 등록한다.

    프로젝트 폴더에 urls.py에서 urlpatterns에 앱의 urls.py를 추가한다.

    (앱에서 urls.py는 자동으로 생성되지 않으니 직접 생성해야한다.)

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('todo_app.urls')),
    ]

Model 정의

  • Model은 총 3가지 단계를 거쳐 생성된다.
    1. models.py에 클래스 형태로 정의
    1. makemigrations명령을 통해 DB에 적용할 파일 생성
    1. migrate명령을 통해 migration 파일 DB에 적용

    1. modes.py 정의

    • models.py에 model을 정의하기 위한 entity를 클래스로 정의한다.
    • 클래스에 models.Model을 상속받아 관리하도록 하고 DB에서 관리할 column를 정의한다.
      class Todo(models.Model):
          title = models.CharField(max_length=255)

    2. makemigrations

    • model을 정의하고 makemigrations하면 models.py에 정의한 모델의 migration파일이 생성된다.

      models.py를 수정하면 반드시 makemigration을 해야한다.

      $ python manage.py makemigrations

      실행되면 아래와 같이 어떤 model에 대해서 파일이 생성되었는지 보여준다.

    • makemigration을 하고나면 migrations 폴더에 생성된 initial파일을 확인할 수 있다.

    • 생성된 파일을 살펴보면 기본적으로 id필드를 생성해주며 정의한 title필드가 추가된 모습을 볼 수 있다.
      TodoList/todo_app/migrations/0001_initial.py

    3. migrate

    • migration에 생성된 파일을 가지고 DB에 변경사항을 적용하기 위해 migrate명령을 실행한다.
      $ python manage.py migrate

      실행되면 어떤 migration 파일이 적용되었는지 보여준다.

    * DB 확인

    • dbshell명령을 통해 DB에 제대로 적용이 됐는지 확인할 수 있다.
      $ python manage.py dbshell

    • 먼저 테이블을 확인한다.
      sqlite> .tables

      [프로젝트_이름]_[앱_이름]으로 테이블이 생성되었음을 볼 수 있다.

      .tables 결과화면

    • 다음으로 생성된 테이블의 정보를 확인한다.
      sqlite> pragma table_info(todo_app_todo);

      자동으로 생성된 id와 정의한 title속성을 볼 수 있다.

    • sqlite도 기본적인 SQL문법과 같으니 몇가지 데이터를 넣어서 동작을 확인한다.
      # 데이터 삽입
      sqlite> insert into todo_app_todo(title) values('Fisrt');
      
      # 데이터 확인
      sqlite> select * from todo_app_todo;
      1|Fisrt
      
      # 데이터 삭제
      sqlite> delete from todo_app_todo;
      sqlite> select * from todo_app_todo;
      
      # rollback이나 commit 명령은 동작하지 않는다.
      sqlite> rollback;
      Error: cannot rollback - no transaction is active
      sqlite> commit;
      Error: cannot commit - no transaction is active

View 정의

  • view를 담아둘 templates라는 폴더를 만든다.
    $ cd todo_app
    $ mkdir templates

  • 폴더에 index.html을 만들고 기본 페이지로 쓰고 싶은 페이지를 작성한다.
    $ cd templates
    $ touch index.html

Controller 정의

  • controller는 크게 두가지를 정의해야한다.
    1. views.py에 view와 연결시킬 함수 정의
    1. urls.pyviews.py에 정의한 함수와 연결될 url 정의

    1. view 함수 정의

    • views.py에 controller를 정의하기 위해 view와 연결할 함수를 생성한다.
    • 정의할 함수는 아래와 같다.

      1. index : 시작 페이지 render

        DB에서 모든 값을 가져와 index.html에 인자로 넘겨준다.

        from django.shortcuts import render
        
        # url = ''
        def index(request):
        		_todos = Todo.objects.all()
            return render(request, 'index.html', {'todos': _todos})

      1. create_todo : 할일 추가

        POST로 todoContent라는 name의 값을 받아와 model클래스에 정의된 Todo객체를 만들어 DB에 저장(save)한다.

        저장한 후 redirect를 통해 index 페이지로 돌아간다.

        from django.shortcuts import HttpResponseRedirect
        from todo_app.models import Todo
        from django.urls import reverse
        
        # url = /create_todo
        def create_todo(request):
            content = request.POST['todoContent']
            new_todo = Todo(title=content)
            new_todo.save()
            return HttpResponseRedirect(reverse('index'))

      1. delete_todo : 할일 삭제

        GET방식으로 todoNum이라는 name의 값을 받아와 DB에서 id값으로 찾는다.

        찾은 데이터를 삭제(delete)하고 redirect를 통해 index페이지로 돌아간다.

        # url = /delete_todo
        def delete_todo(request):
            _id = request.GET['todoNum']
            todo = Todo.objects.get(id=_id)
            todo.delete()
            return HttpResponseRedirect(reverse('index'))

    url 패턴 등록

    • 앱 폴더안에 urls.py를 추가한다.
    • 앱 내부에서 controller와 view를 연결할 수 있도록 urlpatterns를 등록한다.
      from django.urls import path
      from . import views
      
      urlpatterns = [
          path('', views.index, name='index')
      ]

실행화면

'Develop > Django' 카테고리의 다른 글

[Django Rest Framework] To Do List  (0) 2021.03.16
Django - APP 만들기  (0) 2021.01.15
Django 설치  (0) 2021.01.15