Django - 프로젝트 작성 해보기

Lee Ju-Hyeon(David)·2021년 9월 8일
0

Django

목록 보기
3/10
post-thumbnail

이제 본격적으로 Django 프로젝트를 작성할 것이다. 프로젝트 작성은 데이터의 흐름에 맞게 작성하는 것이 좋다.

  • url을 설정하고 (urls.py)
  • url요청에 맞는 view에 함수를 작성하고 (view.py)
  • 사용자에게 보여줄 template를 작성한다. (templates)

1. Model 정의

프로젝트를 작성하기 전에 데이터베이스의 구조를 먼저 정의해야 한다. 이는 models.py에 작성하면 된다.

#models.py
from django.db import models
from django.db.models.fields import CharField, DateTimeField

class Record(models.Model):
    date = CharField(max_length=8)
    push_up = CharField(max_length=20)
    pull_up = CharField(max_length=20)
    create = DateTimeField(auto_now_add=True)

필자는 위와 같이 model을 정의 했다.

각 Field들의 역할 및 더 많은 정보는 공식문서를 참고

model의 정의가 끝나면 다음 두 작업을 진행해야한다.

$ python manage.py makemigrations
$ python manage.py migrate

makemigrations은 model을 토대로 데이터베이스의 구조를 만드는 일이다. 건물을 짓기 위해 설계도를 작성하는 것과 같다.

class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Record',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('date', models.CharField(max_length=8)),
                ('push_up', models.CharField(max_length=20)),
                ('pull_up', models.CharField(max_length=20)),
                ('create', models.DateTimeField(auto_now_add=True)),
            ],
        ),
    ]

위의 사진과 같이 migration가 생성된다. 이후에 migrate를 통해 데이터베이스를 만든다.
터미널 창을 보면 여러가지가 완료되었다고 기록이 나온다. 가장 아래에서 두번 째에 기록되어 있는 record.0001_initial이 우리가 만든 model을 기반으로한 데이터베이스이다. 나머지는 기본앱들을 위한 데이터베이스에 해당한다.

만약에 데이터베이스 구조가 변경될 경우 makemigrations를 다시 한 번 진행해서 변경된 부분을 추가해줘야 한다. 그리고 다시 migrate로 반영해주어야 한다.

#생략
    create = DateTimeField(auto_now_add=True)
    update = DateTimeField(auto_now=True)

아래에 update라는 새 field를 추가했으니 model이 바뀌었다. 따라서 migration을 새로 만들어야 한다.

class Migration(migrations.Migration):

    dependencies = [
        ('records', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='record',
            name='update',
            field=models.DateTimeField(auto_now=True),
        ),
    ]

위와 같이 두 번째 migration이 생성되고 첫 번째 migration을 기반으로 수정된 부분만 추가된 것을 확인할 수 있다. 이후 다시 migrate 명령어로 반영해주면 된다.
마찬가지로 변경된 부분이 반영되는 것을 확인할 수 있다

2. 관리자 페이지 작성

관리자 페이지를 작성해서 데이터베이스가 정상적으로 작성되었는지 확인해보자.

#admin.py
from django.contrib import admin
from .models import Record

class RecordAdmmin(admin.ModelAdmin):
    list_display = ('pk', 'date', 'push_up', 'pull_up')

admin.site.register(Record, RecordAdmmin)

list_diplay는 관리자 페이지에서 어떤 항목을 보여줄지 결정한다. 데이터는 튜플이나 리스트 형태로 작성하면 된다. 위와 같이 관리자 페이지를 설정하고 나서 아래의 명령어를 실행하면 된다.

$ python manage.py createsupersuer
  • 관리자 계정명
  • 이메일 주소
  • 비밀번호
  • 비밀번호 확인

을 입력하고 나면 관리자 계정이 생성된다.
서버도메인 뒤에 /admin을 입력하면 관리자 페이지로 넘어간다. 아까 작성한 계정과 비밀번호를 입력하면
로그인이 되면서 우리가 만든 Record라는 테이블을 볼 수 있다.
관리자 계정으로 데이터를 하나 만들었다. 아까 list_display에 작성한 내용이 표시되었음을 알 수 있다.

여기서 pk는 primary key를 의미하는데 직접 입력하지 않아도 Django에서 자동으로 생성해준다.
관리자 페이지에서 만든 데이터가 데이터베이스에 잘 반영되었다.


3. 프로젝트 작성

3.1 url 작성

먼저 앱이 아닌 프로젝트 폴더의 url을 설정한다.

#urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    #직접 만든 앱을 위한 경로 추가
    path('records/', include(records.urls)),
]

프로젝트를 생성하고 나면 기본적으로 admin(관리자 페이지)를 위한 url이 정의되어 있다. 여기에 직접 만든 앱을 위한 url을 추가했다.

그리고 나서 records폴더에 urls.py를 추가해준다.

#records/urls.py
from django.urls import path
from . import views

app_name = 'record'
urlpatterns = [
    path('', views.index , name='index')
]

app_name부터 살펴보면 지금은 앱이 하나밖에 없어서 특정 template이 하나밖에 없지만, 프로젝트가 커지면 동일한 이름을 가진 template가 생길 수 있다. 이 때, 혼동을 없애기 위해서 특정 앱의 특정 template를 지칭하기 위해서 작성하는 것이다. 이를 url_namespace라고 한다.

urlpattern리스트 안에 path의 세 번째 인수를 추가하는 것을 Naming URL partterns라고 한다. 이를 추가하는 이유는 url의 구조에 대한 의존성을 줄이기 위해서 이다. url이 바뀌면 view나 template에서 작성할 url도 모두 바꿔줘야 한다. 하지만 Naming URL partterns을 이용하면 urls.py만 수정해주면 다른 부분을 수정할 필요가 없게 된다.

view와 template를 작성할 때 이유를 확인할 수 있다.

정리하자면 app_name과 Naming URL partterns을 사용하는 이유는 프로젝트 내에서 url로 인한 혼동을 줄이기 위해서 사용한다.

3.2 view 작성

path('', views.index, name='index')

urls.py에 추가한 경로 정보를 보면 index라는 경로를 이용하면 viewindex라는 함수를 사용한다고 되어 있다.

이제 view 파일에서 index 함수를 정의해줘야 한다.

#views.py
def index(request):
    return render(request, 'records/index.html')

함수 내용을 살펴보면 별 다른 행동은 하지 않고 index.html을 화면에 랜더링 해준다고 되어 있다. 여기서 template의 폴더 구성을 살펴볼 필요가 있다.
사진을 보면 templates폴더 안에 records라는 폴더를 만들어서 그 안에 template를 위치시킨걸 확인할 수 있다. 이유는 name_space를 사용하는 이유와 비슷한데 프로젝트의 크기가 커져서 앱이 여러개가 존재할 때 혼동을 줄이기 위함이다.

<h1>안녕하세요</h1>

index.html파일의 내용은 위와 같고, 결과는 아래와 같다.

0개의 댓글