본문 바로가기

개발

파이썬3 Django

1. Django 설치

# pip install django
# django-admin startproject parksite                       #프로젝트 생성
# ls -l

drwxr-xr-x 1 ibmhp011 197121 0 Oct  2 11:01 parksite/

# ls -l parksite

-rwxr-xr-x 1 ibmhp011 197121 686 Oct  2 11:01 manage.py*
drwxr-xr-x 1 ibmhp011 197121   0 Oct  2 11:01 parksite/


# cd parksite
# python manage.py makemigrations
# python manage.py migrate
# ls -l

-rw-r--r-- 1 ibmhp011 197121 131072 Oct  2 11:15 db.sqlite3
-rwxr-xr-x 1 ibmhp011 197121    686 Oct  2 11:01 manage.py*
drwxr-xr-x 1 ibmhp011 197121      0 Oct  2 11:15 parksite/

# python manage.py runserver                                 #웹 실행
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
October 02, 2023 - 11:17:59
Django version 4.2.5, using settings 'parksite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

■ Django 설치

 

***
서버쪽 데이터베이스를 만드는것은 Model을 만든다 생각하시면 되고
웹페이지 화면을 만든다 하면 Template를 만든다 생각하시면 되고
템플릿에서 서버에 일을 시키는건 View를 만든다 생각하시면 됩니다

2.  Application 작성

# python manage.py startapp polls                               #앱 생성
# ls -l polls
-rw-r--r-- 1 ibmhp011 197121   0 Oct  2 11:38 __init__.py
-rw-r--r-- 1 ibmhp011 197121  66 Oct  2 11:38 admin.py
-rw-r--r-- 1 ibmhp011 197121 148 Oct  2 11:38 apps.py
drwxr-xr-x 1 ibmhp011 197121   0 Oct  2 11:38 migrations/
-rw-r--r-- 1 ibmhp011 197121  60 Oct  2 11:38 models.py
-rw-r--r-- 1 ibmhp011 197121  63 Oct  2 11:38 tests.py
-rw-r--r-- 1 ibmhp011 197121  66 Oct  2 11:38 views.py

# cd polls ; vi views.py                                                    #웹 프론트 Index 리스폰스 생성
------------------------------------------------------------------------------------------------------
from django.shortcuts import render

from django.http import HttpResponse

# Create your views here.
def index(request):
    return HttpResponse('안녕! 내 페이지에 온걸 환영해!')
------------------------------------------------------------------------------------------------------

# vi urls.py                                                                        #웹 프론트 Index url등록 py생성
------------------------------------------------------------------------------------------------------
from django.urls import path
from . import views

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

■ 프로젝트에 application url을 parksite 웹 서버와 연동하기!
# ls -l /d/python_work/Django/parksite/parksite/
-rw-r--r-- 1 ibmhp011 197121    0 Oct  2 11:01 __init__.py
drwxr-xr-x 1 ibmhp011 197121    0 Oct  2 11:17 __pycache__/
-rw-r--r-- 1 ibmhp011 197121  409 Oct  2 11:01 asgi.py
-rw-r--r-- 1 ibmhp011 197121 3350 Oct  2 11:01 settings.py
-rw-r--r-- 1 ibmhp011 197121  786 Oct  2 11:01 urls.py                   <- parksite의 기존 urls.py에 연동
-rw-r--r-- 1 ibmhp011 197121  409 Oct  2 11:01 wsgi.py

# vi /d/python_work/Django/parksite/parksite/urls.py
------------------------------------------------------------------------------------------------------
from django.urls import path

from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),                                             <- polls APP의 웹루트와 urls.py를 연동(index)
    path('admin/', admin.site.urls),
]
------------------------------------------------------------------------------------------------------

# python manage.py runserver                                     #웹 실행
 

3-1. Model (DataBase) 생성하기

# vi polls/models.py
------------------------------------------------------------------------------------------------------
from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_data = models.DateTimeField('data published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
------------------------------------------------------------------------------------------------------

***Question,
Choice라는 Model을 생성했다.
1. Question에는 질문내용과 발행날짜를 정의
2. Choice에는 선택한 질문내용, 선택내용, 투표번호를 정의
3. Question에 Choice는 외래키로 연결 되었고, Question의 데이터가 삭제 될 때 Choice의 CASCADE 속성으로 인해 Choice의 데이터도 삭제 되도록 되어있다.
4.
CharField는 문자열로 이루어진 데이터이며 글자수 제한을 200개로 설정, IntegerField는 정수형 데이터이며 default를 0으설정

3-2. Model (DataBase) 를 프로젝트 스키마에 활성화  *polls APP의 Model

# cat parksite/settings.py                                               #프로젝트 설정에 Application 등록 전 확인
------------------------------------------------------------------------------------------------------
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
------------------------------------------------------------------------------------------------------
***application의 Model을 활성화 하려면 사전에 생성 한 application을 등록해주어야 한다.

# cat polls/apps.py                                                         
  #Application 이름 확인
------------------------------------------------------------------------------------------------------
from django.apps import AppConfig

class PollsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'polls'

------------------------------------------------------------------------------------------------------

# vi parksite/settings.py                                                  #프로젝트 설정에 Application 등록
------------------------------------------------------------------------------------------------------
# Application definition
INSTALLED_APPS = [
    'polls.apps.PollsConfig',                                               <- appName.apps.py.ClassName 형식
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
------------------------------------------------------------------------------------------------------

# python manage.py makemigrations polls                   #polls App Model을 Migration(이식) 한다.
Migrations for 'polls':
  polls\migrations\0001_initial.py
    - Create model Question
    - Create model Choice

# cat /d/python_work/Django/parksite/polls/migrations/0001_initial.py
------------------------------------------------------------------------------------------------------

***model.py파일을 읽어 Django가 DB에 Migration시키기 전에 수정사항(이력)을 기록/생성 했다.
***makemigrations 커맨드는 application에서 model의 수정사항을 기록. 아직 프로젝트에 application이 migration 되지 않았다.

# python manage.py migrate                                     #polls App Model정보를 Migrate!!!  (명령어에 polls 지정 X)

***app생성, 프로젝트 app 포팅, model 연동 완료
***결론: 프로젝트에 application을 연결하는것은 url도 연결하고 model도 migration 해주어야 한다.




■makemigrations와 migrate의 차이
makemigrations:  application의 model의 model에 대한 변화를 기록하며 0001_initial.py 사람이 읽기 편한 Python 언어로 생성되어 DB에 이식 될 때는 sql언어로 변환된다!
     *** model 내용이 수정되면 0002가 생기며 쌓이는 식이다. 변환시 SQL문을 확인하는 명령어  # python manage.py sqlmigrate polls 0001(변경기록번호)
migrate: makemigrations의 변화 기록을 참고하여 실제로 프로젝트 모델 스키마에 application의 모델 변화사항을 반영해주는 명령어

4-1.  Model(DB)에 정보 추가하기 - Admin Page

*** 모델에 데이터를 추가하는 방법은 여러가지
1. 웹페이지상 view에서 model에 데이터베이스 추가하도록 요청하는 기능 구현
2. 서버 개발자가 admin페이지에서 직접 데이터 추가 ( 장고 공식 튜토리얼 소개 )
3. 서버 개발자가 django shell을 이용해서 직접 데이터 추가 ( 장고 공식 튜토리얼 소개 )


# python manage.py createsuperuser                            #admin 계정 생성

# vi polls/admin.py                                                              #admin page에 polls의 Model(DB) 연동 코드 추가
------------------------------------------------------------------------------------------------------
from django.contrib import admin
from .models import Question,Choice

admin.site.register(Question)
admin.site.register(Choice)

------------------------------------------------------------------------------------------------------
*** 연결 완료 후 데이터를 추가했다.

4-2.  Model(DB)에 정보 추가하기 - 장고 shell을 이용

# python manage.py shell                                                               #장고 shell 실행 (DB 쿼리 같은 느낌이다.)
>>> from polls.models import Choice, Question  # Import the model 클래스

# 하기 커맨드로 데이터베이스에서 Question 데이터베이스를 전부 불러옵니다.
# 아직 추가한게 없으면 [] 이렇게 빈 데이터들이 뜹니다.
>>> Question.objects.all()
<QuerySet []>                                                                <-없으면 []가 표시됨
<QuerySet [<Question: Question object (1)>]>         <-나는 admin page에서 test로 하나 만들었었다.

# Question에 관한 새로운 데이터를 만드는 과정입니다.
# What's new? 라는 질문 데이터를 만들어봅시다.
>>> from django.utils import timezone
>>> q = Question(question_text="Park First Django", pub_data=timezone.now())

# 데이터를 만들었으면 데이터베이스에다가 데이터를 저장해줍시다.
>>> q.save()

# 방금 저장한 데이터의 id는 1이 됩니다.
>>> q.id
1
2                                                     <-나는 2번째 데이터라 2

# 파이썬 attribute를 통해 데이터의 내용을 확인 할 수 있습니다.
>>> q.question_text
'Park First Django'
>>> q.pub_date
datetime.datetime(2023, 10, 4, 6, 34, 57, 14817, tzinfo=datetime.timezone.utc)

# 아래처럼 데이터를 변경하고 save를 통하여 다시 데이터베이스에 업데이트 가능합니다.
>>> q.question_text = "Park First Django는퍼펙트 하구만!!"
>>> q.save()
>>> q.question_text
>>> q.id
'Park First Django는퍼펙트 하구만!!'
2

# objects.all() 은 데이터베이스에서 Question에 관한 모든 데이터를 보여줍니다.
>>> Question.objects.all()
 <QuerySet [<Question: Question object (1)>, <Question: Question object (2)>]>
***Question.objects.all() 함수를 입력했는데 오브젝트에 관한 정보만 나오고 안에 데이터는 나오지가 않는다.
입력한 데이터의 내용을 출력 할수 있도록 클래스 안에 __str__(self) 함수를 재정의 한다.

# vim polls/models.py                                                          #models.py 수정 (admin page에도 적용되어 표시 된다.)
------------------------------------------------------------------------------------------------------
from django.db import models
     
# Create your models here.
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_data = models.DateTimeField('data published')
    def __str__(self):                                              <-장고에서는 이러한 출력함수 __str__을 커스텀 하는것을 권장
        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):                                               <-장고에서는 이러한 출력함수 __str__을 커스텀 하는것을 권장
        return self.choice_text

------------------------------------------------------------------------------------------------------

***데이터 출력 형식 변경 확인
>>>from polls.models import Choice, Question
>>>Question.objects.all()
<QuerySet [<Question: 나는누굴까>, <Question: Park First Django는퍼펙트 하구만!!>]>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고사이트:https://lucky516.tistory.com/52