본문 바로가기

웹/Django

Django 2. 프로젝트 뼈대 만들기

파이참 기준

 

1.프로젝트 뼈대 만들기

터미널에 다음과 같은 일련의 명령어들을 입력하자

>django-admin startproject mysite   //mysite 라는 프로젝트를 생성

>python manage.py startapp polls   //polls 라는 애플리케이션(모듈) 을 생성

>notepad settings.py                    // 설정 파일을 확인 및 수정

>python manage.py migrate           // 데이터베이스에 기본 테이블을 생성

>python manage.py runserver        // 서버 실행과 확인

 

그럼 다음과 같은 디렉토리 구조가 보일것이다.

BASE_DIR--------db.sqlite3                              //sqllite3 db 파일, 테이블 정보가 존재 

                |

                |-----manage.py                           // 장고 명령어 처리 파일

                |

                |-----mysite-----------__init__.py       // 디렉토리에 이 파일이 있으면 파이썬 패키지로 인식

                |                     |-----settings.py     //프로젝트 설정 파일

                |                     |-----urls.py          // 프로젝트 레벨인 최상위 URLconf                          

                |                     |-----wsgi.py         // apache 와 같은 웹서버와 wsgi(http 같은 것들) 연동

                |

                |-----polls-------------__init.py        //파이썬 패키지 인식

                                     |-----admin.py      // Admin 사이트 모델 클래스 등록을 위한 파일

                                     |-----apps.py        // 어플리케이션 설정 클래스 정의

                                     |-----models.py     // 모델 클래스 정의

                                     |-----tests.py        // 유닛 테스트용 

                                     |-----views.py       // 뷰 함수 정의하는 파일. 함수형, 클래스형 뷰 모두 이 파일에 정의

                                     |-----migrations----------__init__.py   

                                     |                        //데이터 베이스 변경사항 관리를 위한 디렉토리

                                     |-----templates     //템플릿들이 위치하는 디렉토리 

                                     

startproject mysite 를 하면 mysite 디렉토리가 상위와 하위에 있는 경우가 있다. 

그때에는 상위의 디렉토리 이름을 변경해주자. 그 상위의 디렉토리가 BASE_DIR이다.

startproject mysite . 을 하면 하나의 디렉토리만 만들어지니 상위, 하위 디렉토리를 신경쓰고 싶지 않다면

그냥 . 을 더 붙이자

 

 

2.settings.py

프로젝트 레벨의  setting이다.

a. DEBUG = True/False 

   True 이면 개발자 모드

   개발자 모드에는 ALLOWED_HOSTS에 값이 없어도 ['localhost','127.0.0.1'] 로 된다.

   False 이면 운영모드이다. 

   운영모드인 경우에는 반드시 ALLOWED_HOSTS에 서버의 IP 혹은 도메인을 지정해야 한다.

   

b. ALLOWED_HOSTS

   기동할 서버의 ip가 여러개라면 그 ip도 지정한다. 

    ALLOWED_HOSTS = [ 다른ip, 'localhost' , '127.0.0.1' ]

 

c. INSTALLED_APPS

   개발하고 있는 애플리케이션은 등록이 필요하다. 

   모듈명만 등록해도 되지만 애플리케이션의 설정 클래스로 등록하는 것이 더 정확한 방법이다.

   polls.apps.PollsConfig

 

d. DATABASES 

    만약 오라클이나 mysql 을 사용하고자 한다면 이 항목을 수정하면 된다.

 

 

3.기본 테이블의 생성

   장고는 반드시 사용자와 그룹 테이블등이 필요하다고 가정 하에 설계되었다. 

   때문에 테이블이 없으면 사용자와 테이블을 만들어줘야 된다.  

   이때 필요한 명령어가 migrate 이다. 이 명령어는 db에 변경사항이 있을때 그것을 반영해주는 명령이다.

   migrate 명령에 대한 결과로 sqlLite3 파일이 생성된 것을 확인할 수 있다. 

   

 

4. 작업의 확인

   >python manage.py runserver 를 해보자

   지정한 포트가 따로 있다면 python manage.py runserver 포트번호   를 하면 된다.

   localhost:8000/admin 을 하면 로그인 페이지가 나온다.

   회원으로 등록된것이 없으니 일단 관리자 계정을 만들어보자

  

 

5. create superuser

   관리자 계정은 다음과 같이 만든다.

   >python manage.py createsuperuser 

 

 

6.Model 코딩

model은 데이터를 관리하는 쪽이다. 

a. 데이터 베이스 변경 사항 추출

python manage.py makemigrations

 

b. 데이터베이스에 변경사항을 반영

python manage.py migrate

 

c.테이블의 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from django.db import models
 
 
# Create your models here.
 
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
 
    def __str__(self):
        return self.question_text
 
 
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
 
    def __str__(self):
        return self.choice_text
 
cs

장고는 ORM을 사용하며 각 클래스는 models.Model을 파라미터로 받고

model 객체에서 메소드로 테이블 정의를 한다.

특이한 점은 장고는 테이블의 pk를 자동으로 integerField 도 생성해 준다.

8행의 'date published' 는 레이블 문구이다. 

15행의 fk 의 실제 칼럼이름은 question_id 이다. 

10행과 19행의 def __str__이 없으면 테이블 명이 제대로 표시가 되지 않는다..

 

d. 테이블의 반영

1
2
3
4
5
6
7
from django.contrib import admin
 
# Register your models here.
from polls.models import Question, Choice
 
admin.site.register(Question)
admin.site.register(Choice)
cs

위 코드는 admin.site.register(모델 클래스)로 admin 페이지에 반영한 것이다. 

위와 같이 적으면 polls 와 Questino, Choice 에 빨간줄이 있을수도 있지만 무시하자 이게 맞다

 

 

7.URLconf 지정

1
2
3
4
5
6
7
8
9
10
11
12
 
from django.contrib import admin
from django.urls import path
from polls import views
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('polls/', views.index, name='index'),
    path('polls/<int:question_id>/', views.detail, name='detail'),
    path('polls/<int:question_id>/results/', views.results, name='results'),
    path('polls/<int:question_id>/votes/', views.vote, name='vote'),
]
cs

path( 'url' , 해당하는 템플릿, 이름, 딕셔너리 형태로 추가되는 정보) 

4행의 polls 에 빨간 줄이 쳐져 있을지도 모르는데, 이게 맞다.

만약 /polls/3 이라고 url 이 요청이되면 3이 추출되어 views.detail(request, question_id=3) 형태로 대입된다.

혹은 다음과 같이도 작성을 할수도 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
 
from django.contrib import admin
from django.urls import path, include
# from polls import views
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('polls/', include('polls.urls')),
    #이 하위의 내용을 polls.urls 에 작성
# app_name = 'polls'
    # path('polls/', views.index, name='index'),
    # path('polls/<int:question_id>/', views.detail, name='detail'),
    # path('polls/<int:question_id>/results/', views.results, name='results'),
    # path('polls/<int:question_id>/votes/', views.vote, name='vote'),
]
 
cs
 
 
 

9행의 app_name 은 url이 패턴이 같은 경우를 대비해 만든 것이다. 충돌할때 충돌한 것들을 식별한다.

polls:detail, blogs:detail 이런식으로 말이다.

 

 

8.view 함수와 템플릿 작성

디렉토리는 자신의 어플리케이션/templates/~~.html 같이 작성한다.

예시) demo/practice/templates/1.html

1
2
3
4
5
6
7
8
9
10
11
from django.shortcuts import render
 
# Create your views here.
from polls.models import Question
 
 
def index(request):
    latest_question_list = Question.objects.all().order_by('-pub_date')[5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)
 
cs

10행의 render는 httpresponse 객체를 반환한다.

render(request, 이동할 템플릿, 템플릿에 넘겨줄 자료)

이때 주의해야 할것은 이동할 템플릿의 루트가 templates 디렉토리라는 것이다. 

즉, 'polls/index.html' 의 실제 주소는 '/templates/polls/index.html' 이다. 

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

Django 5. 클래스 뷰  (0) 2021.05.13
Django 3. 화면이동과 view 와 template간의 폼 처리  (0) 2021.05.13
django 1. 개발환경 구축하기  (0) 2021.05.10
djando 0. 웹 클라이언트 라이브러리  (0) 2021.05.09
테스트 하기  (0) 2020.12.23