Today I Learned/django

(django) 장고 -MVT모델 (코드 예시 포함)

하나719 2023. 6. 22. 17:57
반응형

MVT 모델

자바 웹 프로그래밍의 MVC방식과 거의 동일한 개념

전체적인 틀을 간단하게 정리해보자

1. Model: 테이블을 정의

  • ORM (Object Relational Mapping) 기법으로 데이터베이스 처리 (간단하게 데이터를 정의할 수 있음)
    • 테이블을 하나의 클래스로 정의 
    • 테이블의 컬럼은 클래스의 변수로 매핑 
  • 마이그레이션: models.py에 새로 추가되거나 수정된 내용을 데이터베이스에 반영해주는 작업
    (models.py 에 클래스로 데이터를 정의해주고 마이그레이션해주면, 데이터베이스에 반영하는 더 복잡한 코드파일이 만들어짐)  
    • makemigrations
    • migrate

<models.py>

from django.db import models

# Create your models here.

class Question(models.Model): #테이블1. 질문
    question_text = models.CharField(max_length=200) #컬럼1. 질문 텍스트
    pub_date = models.DateField('date published') #컬럼2. 질문 등록한 일자

    def __str__(self):
        return self.question_text

class Choice(models.Model): #테이블2. 답변
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    #question 삭제되면 같이 삭제됨 , Question 테이블의 Id와 연결되는 외부키
    choice_text=models.CharField(max_length=200)#컬럼1. 선택지 텍스트
    votes = models.IntegerField(default=0) #컬럼2. 투표

    def __str__(self):
        return self.choice_text

마이그레이션하면 생기는 0001_initial.py 파일

2. View: 애플리케이션의 제어 흐름 및 처리 로직을 정의

  • 로직을 처리하는 가장 중요한 영역으로 개발 범위가 커지면서 해당 파일의 코딩량도 많아짐으로 가독성과 유지보수 편리성, 재활용등을 고려해야 합니다. 
  • 함수형/클래스형 뷰 중 편한 방식으로 코딩하면 되는데 클래스형 뷰 사용시 장고가 제공하는 제네릭 뷰를 사용할 수 있고 재활용 및 확장성 측면에 유리합니다.  
    • 함수형 뷰: 로직을 함수로 코딩 
    • 클래스형 뷰: 로직을 클래스로 코딩

<views.py>

from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render, get_object_or_404
from polls.models import Question, Choice #polls model 구현해둔 테이블 가져온다.


# Create your views here.
def index(request):
    latest_question_list = Question.objects.all().order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list, 'value': 'Hellow, World'}
    return render(request, 'polls/index.html', context)


def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})


def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)

    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))


def results(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/results.html', {'question': question})

3. Template: 사용자가 보게 될 화면의 모습을 정의

  • 웹화면별로 템플릿 파일(.html) 이 하나씩 필요
  • base.html 기본 틀이 되는 화면하나 정의해두고 각 화면에서 extend해서 조립해서 사용!

4. URLconf

 

<myproject -> urls.py>

  • include를 통해 polls 앱에서 사용하는 url로직을 한번에 추가해줌
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("polls/", include('polls.urls'))
]

<polls ->urls.py>

  • localhost:8000/polls/~~~
    • polls에서 구현되는 페이지 하나하나 추가해준다.
from django.urls import path
from . import views

app_name = 'polls'
urlpatterns = [
    path("", views.index, name='index'),
    path("<int:question_id>/", views.detail, name='detail'),
    path("<int:question_id>/vote/", views.vote, name='vote'),
    path("p<int:question_id>/results/", views.results, name='results')
]

파일 구조 참고

반응형