django 03. 첫번째 장고앱 7 - MTV 연동하기

|

django 03. 첫번째 장고앱 7 - MTV 연동하기

파이썬 웹 프로그래밍 - Django로 웹 서비스 개발하기

view - template - model 연동

장고와 MTV

urls.py 수정

root 경로에 views 오브젝트의 index메소드를 연결한다.

url(r'^$', views.index, name = 'index'),

views.py 수정

models 오브젝트의 GuessNumbers 클래스를 import 하고, 데이터를 불러온다.
불러온 데이터를 템플릿에 딕셔너리 형식으로 전달한다.

  • lottos = GuessNumbers.objects.order_by(‘-update_date’) 를 통해 작성일 기준 내림차순으로 데이터를 가져올 수 있다.


from .models import GuessNumbers

def index(request):
    lottos = GuessNumbers.objects.all() #shell에서 하는 것 처럼 데이터를 읽어온다.
    return render(request, 'lotto/default.html', {'lottos': lottos}) # 템플릿 파일 경로 지정

template 파일(defaul.html) 수정

views에서 불러온 models의 데이터(오브젝트)를 template파일에 적용한다.

  • 반복문을 통해서 필요한 정보를 html에 표시한다.
  • linebreaksbr 속성 통해서 줄바꿈

<div class="container lotto">
  {% for lotto in lottos %}
  <h2>{{lotto.text}}</h2>
  <p>last update : {{lotto.update_date}} by {{lotto.name}}</p>
  <p>{{lotto.lottos|linebreaksbr}}</p>
  {% endfor %}
</div>

django 03. 첫번째 장고앱 6 - shell을 이용한 장고 관리

|

django 03. 첫번째 장고앱 6 - shell 이용한 장고 관리

파이썬 웹 프로그래밍 - Django로 웹 서비스 개발하기

shell을 이용한 장고 관리

  • 터미널에서 $ python manage.py shell 입력
  • 장고의 기능을 그대로 사용 가능

모델클래스명.objects.all()

모델 클래스의 오브젝트를 리스트로 모두 가져온다.

$ python manage.py shell
>>> from mylotto.models import GuessNumbers
>>> import datetime
>>> GuessNumbers.objects.all()

<QuerySet [<GuessNumbers: siwa - 당첨기원!>, <GuessNumbers: sunshine - 2등도 좋아!>, <GuessNumbers: monkey - 3등도 좋지~>]>

모델클래스명.objects.get()

모델 클래스의 특정 오브젝트를 가져온다. .save()를 통해서 DB에 저장할 수 있다.

>>> GuessNumbers.objects.get(name = 'siwa')
<GuessNumbers: siwa - 당첨기원!>

>>> g = GuessNumbers.objects.get(name = 'siwa')
>>> g.name
'siwa'
>>> g.name = 'siwaaaaaa'
>>> g.generate()
>>> g.save()

django 03. 첫번째 장고앱 5 - VIEWS와 템플릿, 정적파일 연동

|

django 03. 첫번째 장고앱 5 - VIEWS와 템플릿, 정적파일 연동

파이썬 웹 프로그래밍 - Django로 웹 서비스 개발하기

views와 템플릿 연동

  • urls.py 수정 (위치 : 프로젝트 폴더 - mysite)
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^lotto/$', views.index, name = 'index'),
]
  • views.py 수정 (위치 : 앱 폴더 - mylotto)
def index(request):
    return render(request, 'lotto/default.html', {}) # 템플릿 파일 경로 지정
  • 템플릿 폴더 및 html 템플릿 파일 작성
    • 경로 : mylotto/templates/lotto/default.html (app 폴더 내)
    • 장고 사이트에 여러 어플리케이션 등록 가능, 나중에 중복생성하지 않기 위해서 템플릿을 위 경로에 작성
    • http://127.0.0.1:8000/lotto/ 를 통해서 템플릿 연동 완성!
  • static 파일 연동하는 방법
    • static 폴더 경로 : mylotto/static/css/lotto.css (app 폴더 내)
    • 템플릿 html 파일 내에서 css 연동 (\ 무시)
        
      <!DOCTYPE html>
      {% load staticfiles %}
      ...
      ...
      <link rel="stylesheet" href="{% static 'css/lotto.css'%}">
        
    
    • 장고에게 static 파일이 (css) 생겼다는 걸 알려준다.
    python manage.py collectstatic
    

django 03. 첫번째 장고앱 4 - 장고 테스트 코드 작성

|

django 03. 첫번째 장고앱 4 - 장고 테스트 코드 작성

파이썬 웹 프로그래밍 - Django로 웹 서비스 개발하기

장고 테스트 코드 작성

GuessNumbers 모델 클래스의 generate 메소드를 테스트 해본다.

test.py 활용 (위치 : app 폴더 - mylotto)

  • 모델 클래스 GuessNumbers의 generate 메소드를 테스트 하기 위해 test.py 파일에 아래와 같이 테스트 코드를 작성한다.
from django.test import TestCase
from .models import GuessNumbers

# Create your tests here.
class GuessNumbersTestCase(TestCase):
    def test_generate(self):
        g = GuessNumbers(name='monkey', text='1등만세!')
        g.generate()
        print(g.update_date)
        print(g.lottos)
        self.assertTrue(len(g.lottos) > 20) #성공실패 테스트 루틴은 assert 메소드를 사용한다.

  • test.py 실행방법 $ python manage.py test
$ python manage.py test

Creating test database for alias 'default'...
2017-02-28 10:23:22.635449+00:00
[4, 14, 16, 22, 28, 33]
[11, 12, 16, 23, 28, 42]
[1, 2, 14, 30, 38, 42]
[6, 7, 14, 25, 27, 43]
[15, 19, 24, 26, 35, 39]

.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Destroying test database for alias 'default'...

django 03. 첫번째 장고앱 3 - MODEL 클래스 만들기, admin site 에 Model 등록

|

django 03. 첫번째 장고앱 3 - MODEL 클래스 만들기, admin site 에 Model 등록

파이썬 웹 프로그래밍 - Django로 웹 서비스 개발하기

MODEL 클래스 만들기

장고는 모델과 데이터베이스를 연결해서 데이터베이스에 영구적으로 데이터를 저장하게 되는데 이를 ORM ( Object – Relational Mapping)이라고 합니다.

  • Model은 M(model)T(template)V(view)의 M
  • DB에 데이터를 저장하거나 불러오기 위해서 모델을 사용한다.
  • 모델은 클래스로 만들어 준다.
  • models.py 작성 후, 장고에게 모델을 만들었다는 걸 알려준다.
$ python manage.py makemigrations
$ python manage.py migrate
  • models.py 내에 GuessNumbers 클래스 작성 예시
from django.db import models
from djang.utils import timezone
import random

# Create your models here.
class GuessNumbers(models.Model): #슈퍼클래스 models의 하위클래스 Model을 상속받는다.
    # 필요한 데이터 정의
    name = models.CharField(max_length = 24)
    lottos = models.CharField(max_length = 255, default = '[1, 2, 3, 4, 5, 6]')
    text = models.CharField(max_length = 255)
    num_lotto = models.IntegerField(defaul = 5)
    update_date = models.DateTimeField()

    # 메소드 정의
    def generate(self):
        self.lottos = ""
        origin = list(range(1,46)) #[1, 2, 3.....44, 45]
        for _ in range(0, self.num_lotto): # self.num_lotto 수만큼 반복해서 아래를 수행한다.
            random.shuffle(origin) # origin 리스트 순서를 섞는다.
            guess = origin[:6] #index번호 0부터 5 까지를 뽑아낸다.
            guess.sort()
            self.lottos += str(guess) + '\n'
        self.update_date = timezone.now()
        self.save() # 오브젝트를 db에 저장

admin site 에 Model 등록하기

어드민을 이용하여 model에 있는 데이터 확인하기

  • http://127.0.0.1:8000/admin/ 접속
  • 로그인을 위한 슈퍼유저(superuser) 생성
$ python manage.py createsuperuser
  • admin.py 에 GuessNumbers 모델 클래스 등록
  • 모델 클래스 등록 후, 어드민 사이트에 재접속하면 해당 모델 클래스 확인 가능
from mylotto.models import GuessNumbers

admin.site.register(GuessNumbers)
  • 어드민 사이트에서 데이터 추가
어드민 사이트 - 모델 클래스 데이터 등록 화면
  • 해당 모델 클래스(GuessNumbers)에 __str__ 메소드를 추가하여 어드민 내 표시방법 변경
def __str__(self):
    return '%s - %s' % (self.name, self.text)