https://docs.djangoproject.com/ko/3.0/intro/tutorial03/
- 이번 포스트에서는 "View"를 다룬다.
- URL로부터 View를 얻기 위해, Django에서는 "URLconf"라는 것을 사용한다.
- URLconf는 URL패턴을 View에 연결한다. (URL dispatcher)
뷰 추가하기
// polls/views.py
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
// polls/urls/py
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
뷰에 기능 구현하기
- 뷰는 HttpResponse를 반환하거나 Exception을 반환한다.
- 뷰는 DB record를 읽어 데이터를 반환환하거나 다양한 third party 템플릿을 사용해 반환 할 수 있다.
- 뷰에 페이지와 관련된 소스코드는 분리하는 것이 좋다.
- polls/templates 디렉토리를 생성한다. Django에서는 template 디렉토리에서 템플릿을 찾는다.
//polls/views.py
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
- django의 render() 메소드 이용하기
- 404 Error 처리
- get_object_or_404() 메소드 이용하기
템플릿에서 URL처리
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
//이러한 강력하게 결합되고 하드코딩된 접근방식의 문제는 수 많은 템플릿을 가진 프로젝트들의 URL을 바꾸는 게 어려운 일이 된다는 점입니다. 그러나, polls.urls 모듈의 path() 함수에서 인수의 이름을 정의했으므로, {% url %} template 태그를 사용하여 url 설정에 정의된 특정한 URL 경로들의 의존성을 제거할 수 있습니다.
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
URL의 namespace 정의
- Django 프로젝트는 polls 앱 이외에도 다양한 앱을 동시에 가질 수 있다.
- polls앱이 detail 뷰를 가지고 있는 상황에서, blog앱에서 detail 뷰를 추가하려고 할 때, Django의 {% url 'detail' %}은 어떤 앱의 detail 뷰인지 어떻게 알 수 있을까?
- URLconf에 namespace를 추가해주면 된다.
- polls/urls.py에 app_name='polls' 변수를 추가해준다.
- 그리고 탬플릿에서는 {% url 'polls:detail' %} 형태로 polls 앱의 detail 뷰를 지정할 수 있다.
- 이제, detail 뷰 함수의 URL을 변경하고 싶다면, 모든 tempate에 있는 URL을 바꾸는 것이 아니라, /polls/urls.py 에서 detail에 대한 설정을 바꾸기만 하면 된다.