프로젝트 설정 파일 변경

  • 데이터베이스 설정항목 확인
    장고는 디폴트로 SQLite3 데이터베이스 엔진을 사용하도록 설정되어있음.
    (MySQL이나 Oracle, ProgreSQL 등 다른 데이터베이스로 변경 가능)

  • 정적파일 설정
    STATIC_URL 항목은 최초 stteings.py 파일이 만들어질때 장고가 해준 그대로.
    STATICFILES_DIRS 항목은 프로젝트 정적 파일이 위치한 디렉터리를 의미, 수동으로 직접 지정.

    정적 파일을 찾을 때 각 애플리케이션의 static/ 디렉터리보다 STATICFILES_DIRS 항목으로 지정한 디렉터리를 먼저 검색.

    STATIC_URL = '/static/'
    STATICFILE_DIRS = os.path.join(BASE_DIR, 'static') # 추가  
    
  • 타임존 지정
    한국시간으로 시간설정 변경

     #TIME_ZONE = 'UTC'
    TIME_ZONE = 'Asia/Seoul'
    
  • 애플리케이션 등록
    프로젝트에 포함되는 애플리케이션은 모두 설정 파일에 지정되어야함.
    애플리케이션을 등록할때는 간단하게 애플리케이션의 모듈명만 등록해도 되지만(ex) ‘bookmark’)
    애플리케이션의 설정 클래스로 등록하는것이 더 정확한 방법임.

     INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      'bookmark.apps.BookmarkConfig',   # 추가  
     ]
    

    애플리케이션 설정 클래스는 해당 애플리케이션에 대한 메타 정보를 저장하기 위한 클래스로,
    django.apps.AppConfig 클래스를 상속받아 작성.
    앱 설정 클래스는 앱 이름(name), 레이블(label), 별칭(verbose_name), 경로(path) 등을 설정할 수 있으며,
    이 중 이름(name)은 필수 속성임.
    만일 INSTALLED_APPS 항목에 애플리케이션을 등록시 설정 클래스 대신에 애플리케이션 디렉터리만 지정하면, init.py파일에서 default_app_config 항목으로 지정된 클래스를 설정 클래스로 사용.
    default_app_config 항목도 지정되어 있지 않으면 장고의 기본 AppConfig 클래스를 설정 클래스로 사용.


애플리케이션 설계

화면 UI 설계

테이블 설계

북마크 앱 - 테이블 설계(Bookmark 모델 클래스)

필드명 타입 제약 조건 설명
id Integer PK, Auto Increment기본 키(Primary Key)
title CharField(100) Blank, Null북마크 제목(Primary Key)
url URLField Unique북마크 URL

로직 설계

로직 설계는 처리 흐름을 설계.
웹 프로그래밍에서 URl을 받아서 최종 HTML 템플릿 파일을 만드는 과정이 하나의 로직이됨.
그 과정에서 리다이렉션이 일어날 수 있고, 템플릿 파일에서 URL 요청이 발생할 수도 있음.
-> 이런 과정들을 모두 고려해서 문서로 표현하는것이 로직 설계 과정!

/bookmark/   ->  BookmarkLV.as_view()  -> bookmark_list.html
/bookmark/pk  ->  BookmarkDV.as_vew()  -> bookmark_detail.html

URL 설계

URL 패턴 - 뷰 이름 - 템플릿 파일 이름
/bookmark/ - BookmarkLV (ListView) - bookmark_list.html
/bookarmk/pk - BookmarkDV (DetailView) - bookmark_detail.html


개발 코딩하기 - 모델

테이블 정의

테이블은 models.py에 정의.
장고에서는 테이블을 하나의 클래스로 정의하고,
테이블의 칼럼은 클래스의 변수(속성)로 매핑함.
테이블 클래스는 django.db.models.Model 클래스를 상속받아 정의하고,
각 클래스 변수의 타입도 장고에서 미리 정의해둔 필드 클래스를 사용함.

bookmark/models.py

from django.db import models  
  
class Bookmark(models.Model):
	title = models.CharField(max_length = 100, blank = True, null = True)
    url = models.URLField('url', unique = True)
    
    def __str__(self):
    	return self.title

Admin 사이트에 테이블 반영

bookmark/admin.py

from django.contrib import admin
from bookmark.models import Bookmark

class BookmarkAdmin(admin.ModelAdmin):
    list_display =  ('title', 'url')

admin.site.register(Bookmark, BookmarkAdmin)

BookmarkAdmin 클래스는 Bookmark 클래스가 Admin 사이트에서 어떤 모습으로 보여줄지 정의.
-> Bookmark 내용을 보여줄 때, title과 url을 화면에 출력하라고 지정함.

admin.site.register() 함수를 사용해 Bookmark와 BookmarkAdmin 클래스를 등록함.

★ 테이블을 새로 만들때는 models.pyadmin.py 두 개의 파일을 함께 수정할 것!

데이터베이스 변경사항 반영

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

마이그레이션 정보는 애플리케이션 디렉터리별로 존재함.


개발 코딩하기 - URLconf

mysite/urls.py

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

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

bookmark/urls.py

from django.urls import path, include
from bookmark.views import BookmarkLV, BookmarkDV

urlpatterns = [
    path('bookmark/', BookmarkLV.as_view(), name = 'index'),
    path('bookmark/<int:pk>', BookmarkDV.as_view(), name = 'detail'),
]

개발 코딩하기 - 뷰

앞에서 URLconf를 작성하며 뷰를 클래스형 뷰로 정의하기 위해 각 URL에 따른 해당 클래스 및 as_view() 메소드를 지정하였음.
URLConf에서 지정한 클래스형 뷰를 작성함.

클래스형 뷰를 작성할 때 가장 먼저 고려할 사항은 어떤 제네릭 뷰를 사용할 것인가 이다. 개발하고자 하는 애플리케이션의 로직을 분석하여 가장 적합한 제네릭 뷰를 사용한다.

북마크 앱에서는 ListViewDetailView 제네릭뷰를 선택해서 사용한다.

bookmark/view.py

# 클래스형 제렉뷰를 사용하기 위해 ListView, DetailView를 import
from django.views.generic import ListView, DetailView 
# 테이블 조회를 위한 모델 클래스 import
from bookmark.models import Bookmark

# ListView
class BookmarkLV(ListView) :
	model = Bookmark 
    
# Detail View
class BookmarkDV(DetailView) :
	model = Bookmark
  • BookmarkLV는 Bookmark 테이블의 리스트를 보여주기 위한 뷰 (ListView 제네릭뷰 상속)
    명시적으로 지정하지 않아도 장고에서 디폴트로 2가지 속성을 알아서 정해줌.
    1) 컨텍스트 변수로 object_list 사용
    2) 템플릿 파일을 모델명소문자_list.html 형식의 이름으로 지정 -> 템플릿 파일명은 ‘bookmark_list.html’이 됨.

  • BookmarkDV는 Bookmark 테이블의 상세 정보를 보여주기 위한 뷰 (DetailView 제네릭뷰 상속)
    명시적으로 지정하지 않아도 장고에서 디폴트로 2가지 속성을 알아서 정해줌.
    1) 컨텍스트 변수로 object 변수를 사용
    2) 템플릿 파일을 모델명소문자_detail.html 형식의 이름으로 지정 -> 템플릿 파일명은 ‘bookmark_detail.html’이 됨.


개발 코딩하기 - 템플릿

bookmark_list.html 템플릿 작성하기

bookmark/templates/bookmark/bookmark_list.html

<!DOCTYPE html>
<html>
<head>
    <title> Bookmark List </title>
</head>
<body>
<div id = "content">
    <h1> Bookmark List </h1>
    <ul>
        {% for bookmark in object_list %}
            <li><a href="{% url 'detail' bookmark.id %}"> {{ bookmark }}</a> </li>
        {% endfor %}
    </ul>
</div>
</body>
</html>

bookmark_detail.html 템플릿 작성하기

bookmark/templates/bookmark/bookmark_detail.html

<!DOCTYPE html>
<html>
<head>
    <title> Bookmark Detail</title>
</head>
<body>
<div id ="content">
    <h1> {{ object.title }} </h1>
    <ul>
        <li> URL : <a href="{{ object.url }}"> {{ object.url }}</a></li>
    </ul>
</div>
</body>
</html>

Bookmark App 완성화면

전체 프로그램 소스

content01

content01


참조