Django tutorial, part 3

김수민·2020년 5월 4일
0

Django+uWSGI+nginx

목록 보기
4/9

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처리

  • 하드코딩된 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에 대한 설정을 바꾸기만 하면 된다.
profile
python developer

0개의 댓글