1. 애플리케이션 설계
- UI, 테이블, 뷰의 흐름을 설계하는 단계다.
2. 프로젝트 뼈대 만들기
1) 기본 설정
- Django 프로젝트를 처음 생성하자마자 미리 해두면 편한 기본 설정이다. 프로젝트 설정은 mysite/settings.py에서 진행하도록 하자.
- 기본 설정은 아래 포스팅의 [5. 기본 세팅(권장)]을 참고하자.
https://kimcoder.tistory.com/339
2) mysite 프로젝트 생성
django-admin startproject mysite .
3) 프로젝트 내에 필요한 애플리케이션 생성
py manage.py startapp [앱 이름]
4) 애플리케이션 등록
- 프로젝트에 포함되는 모든 애플리케이션을 settings.py 설정 파일에 등록한다. 다음과 같이 INSTALLED_APPS 항목에 애플리케이션의 설정 클래스를 등록한다. 예를 들어, blog, api 애플리케이션을 생성했다면 다음과 같이 추가해주면 된다. 설정 클래스 이름의 형식은 동일한 규칙으로 자동으로 생성되어있다.
INSTALLED_APPS = [
'blog.apps.BlogConfig',
'api.apps.ApiConfig',
... # 기존 앱들
]
※ 참고로, 모듈명인 'blog', 'api'로 작성하는 방법도 있지만, 앱의 설정 클래스를 참고할 수 없게 되기 때문에 설정 클래스로 작성하는 것을 권장한다.
5) 기본 테이블 생성
- 사용자와 그룹 테이블을 미리 만들어주고 개발을 시작하는 것이 좋다.
python manage.py migrate
6) 슈퍼유저 생성
- Admin 사이트에 로그인하기 위한 관리자를 생성한다. Username, Email, Password만 설정하면 관리자 계정 생성이 완료된다.
python manage.py createsuperuser
3. Model 코딩
- DB 관련 작업은 다음과 같은 순서대로 진행한다.
- models.py
- admins.py
- python manage.py makemigrations 명령
- python manage.py migrate 명령
1) models.py
- 장고에서 제공하는 적절한 필드 타입을 이용하여 모델 클래스와 필드를 정의한다.
예시
from django.db import models
class Post(models.Model):
category=models.ForeignKey('Category', on_delete=models.SET_NULL, blank=True, null=True)
tags=models.ManyToManyField('Tag', blank=True)
title=models.CharField('TITLE', max_length=50)
description=models.CharField('DESCRIPTION', max_length=100, blank=True, help_text='simple one-line text.')
image=models.ImageField('IMAGE', upload_to='blog/%Y/%m/', blank=True, null=True)
content=models.TextField('CONTENT')
create_dt=models.DateTimeField('CREATE DT', auto_now_add=True)
update_dt=models.DateTimeField('UPDATE DT', auto_now=True)
like=models.PositiveSmallIntegerField('LIKE', default=0)
def __str__(self):
return self.title
class Category(models.Model):
name=models.CharField(max_length=50, unique=True)
description=models.CharField('DESCRIPTION', max_length=100, blank=True, help_text='description text.')
def __str__(self):
return self.name
class Tag(models.Model):
name=models.CharField(max_length=50)
def __str__(self):
return self.name
class Comment(models.Model):
post=models.ForeignKey(Post, on_delete=models.CASCADE, blank=True, null=True)
content=models.TextField('CONTENT')
create_dt=models.DateTimeField('CREATE DT', auto_now_add=True)
update_dt=models.DateTimeField('UPDATE DT', auto_now=True)
@property # 메소드의 반환값을 필드로 정의
def short_content(self):
return self.content[:15]
def __str__(self):
return self.short_content
- 테이블 간 관계를 나타내는 필드는 ForeignKey, ManyToManyField, OneToOneField 3가지가 있으며, 각각 N:1, N:M, 1:1 관계를 표시한다. 장고에서는 한쪽 방향으로 관계를 생성하거나 변경하면 반대 방향으로의 관계를 자동으로 연결해준다.
필드 타입들은 아래 공식 문서에 정리되어 있으니 참고하면 도움이 될 것이다.
https://docs.djangoproject.com/ko/3.2/ref/models/fields/#field-types
2) admin.py
- Admin 사이트에 테이블이 보이도록 모델 클래스들을 admin.py에 등록해준다.
예시
from django.contrib import admin
from blog.models import Category, Post, Tag, Comment
@admin.register(Post) # Post 테이블을 admin 사이트에 등록
class PostAdmin(admin.ModelAdmin):
list_display=('id', 'category', 'tag_list', 'title', 'description', 'image','create_dt','update_dt','like')
search_fields=['title']
def tag_list(self, obj):
return ','.join([t.name for t in obj.tags.all()])
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related('tags') # tags 테이블의 레코드도 같이 가져옴
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display=('id', 'name', 'description')
fieldsets=[
('Info', {'fields':['name']}),
('Date', {'fields':['description'], 'classes':['collapse']}),
]
@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
list_display=('id', 'name')
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
list_display=('id', 'post', 'short_content', 'create_dt', 'update_dt')
3) 테이블을 DB에 반영
> python manage.py makemigrations
> python manage.py migrate
4. URLconf 코딩
- 미리 설계된 뷰 흐름의 내용을 참고해서 urls.py 파일에 URLconf를 코딩한다. URLconf는 하나의 urls.py 파일에 모두 작성하기보다는 각 애플리케이션의 urls.py에 분산해서 작성하는 것이 훨씬 더 깔끔하고 관리가 편하다.
예시
# mysite/urls.py
from django.contrib import admin
from django.urls import include, path
from django.conf.urls.static import static
from django.conf import settings
from mysite.views import HomeView
urlpatterns = [
path('admin/', admin.site.urls),
path('', HomeView.as_view(), name='home'),
path('blog/', include('blog.urls')),
path('api/', include('api.urls')),
]
urlpatterns+=static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# blog/urls.py
from django.urls import path
from blog import views
app_name='blog'
urlpatterns = [
# /blog/post/4/
path('post/<int:pk>/',views.PostDV.as_view(), name='post_detail'),
]
5. View 코딩
- 뷰를 함수형 뷰로 정의할 것인지 클래스형 뷰로 정의할 것인지 결정한다. 클래스형 뷰가 장점이 많기 때문에 클래스형 뷰를 권장한다. 클래스형 뷰를 사용하기로 결정했다면 어떤 제네릭 뷰를 사용할 것인지를 고려해야 한다.
- 클래스형 뷰와 제네릭 뷰가 무엇인지 모른다면 아래 포스팅을 참고하자.
https://kimcoder.tistory.com/581
예시
from django.views.generic import TemplateView
class HomeView(TemplateView):
template_name='home.html'
def get_context_data(self, **kwargs): # 템플릿 시스템으로 넘겨줄 컨텍스트 변수에 대한 작업
context=super().get_context_data(**kwargs)
context['model_list']=['Post', 'Category', 'Tag', 'Comment']
return context
6. Template 코딩
- 사용자에게 보여줄 화면을 구성하는 단계다. 장고의 템플릿 시스템을 적극 활용하여 html 파일을 작성하자.
https://kimcoder.tistory.com/580
- Template 디렉토리는 프로젝트 템플릿 디렉토리와 앱 템플릿 디렉토리로 나뉜다. 말 그대로 프로젝트 템플릿 디렉토리는 프로젝트 내에 생성되는 템플릿 디렉토리고, 앱 템플릿 디렉토리는 각 앱 내에 생성되는 템플릿 디렉토리다. 프로젝트 템플릿 디렉토리에는 각 앱에서 공통적으로 사용될만한 뼈대 템플릿 파일을 두고, 앱 템플릿 디렉토리에는 각 앱에서 사용되는 템플릿 파일들을 위치시키는 것이 좋다.
'Django' 카테고리의 다른 글
[Django] wsgi.py의 역할 및 배포 설정 사항 (0) | 2023.01.26 |
---|---|
[Django] apps.py의 역할 (0) | 2023.01.26 |
[Django] 로깅 (0) | 2023.01.24 |
[Django] 클래스형 뷰와 제네릭 뷰 소개 (0) | 2023.01.24 |
[Django] 템플릿 시스템 (0) | 2023.01.24 |
댓글