본문 바로가기

프로그래밍/python django

투표 어플리케이션을 통해 django 이해하기-1

Django란? Python을 기반으로 한 웹 구축 라이브러리


Django는 MTV 모델을 사용하며 의미는 다음과 같다.



투표 어플리케이션 생성


투표 어플리케이션 생성 예시를 통해 Django를 더 깊게 알아보자.

해당 실습은 이클립스오 파이썬을 통해 기본적인 환경설정과 계정생성까지 완료했다는 가정 하에 진행된다.



프로젝트 우클릭-Django-Create application을 눌러준다.


원하는 어플리케이션 이름을 만들어준다.



위와 같은 여러 리스트가 생성된다. 우선 settings에 들어간다.




30~40줄에 있는 INSTALLED_APPS에 방금 설치한 application 이름을 추가시켜준다.




application 생성이 완료되었다면 다음 application의 기능을 구현해보자. Django는 MTV라는 모델을 사용하여 각 기능들을 구분한다.



M: Model을 의미하며 데이터 베이스에 저장되는 데이터를 뜻한다. ex) oralce, mysql

T:Template을 의미하며 사용자에게 보여지는 부분을 뜻한다. ex)HTML, CSS, Java Script

V:실질적으로 프로그램 로직이 동작, 데이터를 가져오고 템플릿에 전달한다.


즉 데이터베이스(M)에서 데이터를 가져오고 가공/처리(V) 가공된 데이터를 사용자에게 보여준다.(T)


MODEL

모델은 데이터를 정의하는 부분이며 models.py라는 곳에서 정의가 가능하다.


models.py를 통해서 데이터를 정의할 때는 몇가지 규칙이 있다.


테이블을 만들 때는 Class 명으로 정의하며, 특정 데이터 유형을 정의하고 싶을 때는 변수를 통해 정의한다.




from django.db import models

class Question(models.Model): #Question이라는 테이블을 정의한다.
    name = models.CharField(max_length=100)
#Question 테이블 내에서는 name이라는 필드가 있다.
#해당 필드는 Char타입이며 최대 크기는 100글자라는 뜻
#이처럼 데이터형을 지정해주고 싶을땐, 변수와 XXXField형태로 지정해준다.
    date = models.DateTimeField()#날짜형인 date 선언

class Choice(models.Model):#Choice 객체 선언
    name = models.CharField(max_length=100)
    votes = models.IntegerField(default = 0)
 #정수형 votes를 선언하고 해당 데이터의 기본값은 0임을 명시
    q = models.ForeignKey(Question, on_delete=models.CASCADE)
    # 외래키를 지정해준다. 해당 키는 Question 테이블을 참조한다는 뜻
    # on_delete부분은 참조하고 있는 값이 삭제되었을 때 상태를 의미
    #만약 참조하고 있는 값이 삭제될 시 해당 데이터도 삭제 하라는 뜻models.CASCADE)



이처럼 형식을 지정하고


반드시 vote(만든 어플리케이션)의 이름으로 make migration과 migration을 진행해준다


만들어진 데이터를 확인하고 싶다면


admin.py에 들어가서 다음과 같은 3줄을 추가해준다.


127.0.0.1/admin에 들어가 로그인 시 다음과 같이 객체가 추가된 것을 확인 가능하다. add를 눌러보자.


적절한 질문과 날짜를 입력해주고 save and add another을 누르면 질문을 더 추가적으로 작성할 수 있다. 여러가지 질문을 작성해보자.


이번엔 Choices의 add를 눌러서


각 질문에 맞는 답변을 여러가지 입력해주자. 여기서 Q의 Question object(1)은 이전에 내가 등록했던 첫번째 질문이다.

만약 두번째 질문의 답변을 입력하고 싶다면 Question object(2)로 바꿔주자.



이로써 데이터의 입력까지 완료하였다. 다음은 해당 데이터를 Template에 전송해주는 view를 공부해보자.



view

view는 앞서 model에서 만든 data를 가공/처리 후 Template으로 보내주는 역할을 하며, views.py에서 정의한다.

view는 기능을 함수 형식으로 정의할 수 있다.


from django.shortcuts import render
from .models import Question, Choice
#같은 폴더에 위치한 models에서 정의한 Question과 Choice를 사용하기 위한 선언
def index(request): #함수 정의
    a = Question.objects.all() #a라는 변수에 Question 객체(Question의 모든 변수)
    return render(request, 'vote/index.html',{'a':a}) 
#template 폴더 밑의 vote/detail.html에 가공된 데이터를 전송해라.
#전송 시, 앞서만든 변수 a는 'a'(실제로는 a)라는 이름으로 전송해라.

다음과 같은 기능을 view에서 만들었다면 이것을 받을 template이 필요하다.

Template

Template을 따로 보관하기 위한 폴더가 필요하다.



vote밑에 새로 templates이라는 폴더를 만들고



또 그 밑에 vote라는 같은 이름의 폴더를 만들어주자.


또 그 밑에 other을 클릭해서

HTML 파일을



앞서 설정해둔 이름으로 만들어 주자.



Template은 HTML 파일을 기반으로 작성되며 중간 중간 파이썬 형식과 합쳐서 사용한다.


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>투표 어플리케이션</h1>
<p>투표할 질문을 선택해주세요</p>

<table>
<tr>
<th>질문번호</th>
<th>제목</th>
<th>생성일</th>
</tr>
{# html+pydev 파일에서의 주석은 다음과 같이 괄호와 샵을 사용한다. #}

{% for q in a %} {# 만약 파이썬 문법을 사용하고 싶다면 {% %}를 사용한다. #}
{# for문의 시작 #}

<tr>
<td>{{q.id}}</td> {# 단순히 값을 표한하고 싶다면 {{ }} 을 사용한다.#}
<td>{{q.name}}</td>
<td>{{q.date}}</td>
</tr>
{% endfor %} {# for문의 마지막 #}

</table>

</body>
</html>


마지막으로 해당 화면을 확인하기위해 URL을 지정해줘야한다. vote 폴더가 아닌 프로젝트 폴더에 있는 urls.py를 사용하여 url 정의가 가능하다.


 



url의 정의는 다음 코드를 추가하면 된다.


from django.contrib import admin
from django.urls import path
from vote.views import index #vote 폴더에있는 views 파일의 index 함수 선언


urlpatterns = [
    path('admin/', admin.site.urls),
    path('vote/', index), #URL에 vote를 붙일 시 index 함수가 실행되게 해준다.
    
]


즉 결과로


127.0.0.1:8000/vote를 입력 시 위와 같은 화면이 뜰 수 있다.

urls.py는 프로젝트 폴더에 있기때문에 관리가 쉽지 않다. 다양한 app의 url을 한 곳에서 관리하는 것은 굉장히 복잡하기때문에 보통은 각 application별로 하위 url 파일을 따로 만들어서 관리한다.


from django.contrib import admin
from django.urls import path, include #include를 사용하기 위한 선언


urlpatterns = [
    path('admin/', admin.site.urls),
    path('vote/', include('vote.urls')), 
#path에 include를 입력해준다. 
#vote 폴더 안의 urls 파일에서 설정해주는 모든 url은 암묵적으로 앞에 vote/가 붙는다는 뜻이다.
]

이와 같이 설정을 하고

파이썬 모듈을 새로 만들어


앞서 include 안에 입력했던 이름(urls)로 만들어준다.

해당 urls.py 안에다가는


from django.urls import path #상위 파일을 선언해주고
from .views import * #views에 정의한 함수 모두를 선언해준다.
app_name='vote'

urlpatterns = [
    path('', index), #해당 path에는 ''를 입력했지만 실제로는 vote/라는 뜻
    
    ]


이로써 MVT 모델을 살펴보았다. 다음 시간에는 조금 더 기능적인 부분을 구현하는 것에 집중하여 진행하겠다.