본문 바로가기
  • 실행력이 모든걸 결정한다
Django

[Django] 프로젝트 개발 순서

by 김코더 김주역 2023. 1. 25.
반응형

1. 애플리케이션 설계

- UI, 테이블, 뷰의 흐름을 설계하는 단계다.

 

 

 

2. 프로젝트 뼈대 만들기

1) 기본 설정

- Django 프로젝트를 처음 생성하자마자 미리 해두면 편한 기본 설정이다. 프로젝트 설정은 mysite/settings.py에서 진행하도록 하자.

- 기본 설정은 아래 포스팅의 [5. 기본 세팅(권장)]을 참고하자.

https://kimcoder.tistory.com/339

 

[Django] Django 소개 / 프로젝트 생성

1. Django 소개 - Python 기반의 Web Framework들 중 하나로, MVT(Model-View-Template) 패턴을 따른다. 장고는 MVC 패턴의 View를 Template, Controller를 View라고 부른다. - 장고에서는 전체 프로그램을 프로젝트라 하고,

kimcoder.tistory.com

 

 

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

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

 

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

 

[Django] 클래스형 뷰와 제네릭 뷰 소개

장고에서는 뷰를 클래스로도 작성할 수 있으며, 함수형 뷰보다는 클래스형 뷰가 더 이점이 많다. 이번 포스팅에서는 클래스형 뷰와 제네릭 뷰에 대한 감을 잡아보자. 1. 클래스형 뷰의 장점 - 다

kimcoder.tistory.com

 

예시

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

 

[Django] 템플릿 시스템

1. 템플릿 시스템과 렌더링 - 템플릿 시스템은 템플릿 문법으로 작성된 템플릿 코드를 해석하여 HTML, XML, JSON 등의 파일로 결과물을 만들어주는 시스템이다. - 템플릿 코드를 해석하는 과정을 렌

kimcoder.tistory.com

- 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

댓글