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
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')
]
반응형