part3에서는 'views' 기능을 만드는데 집중 (공식 웹사이트에서는 public interface라는 용어를 썼다.)
Overview
-'view'는 장고 어플리케이션의 일종의 웹페이지 타입으로, 특정한 템플릿을 가진 특정한 기능을 제공해준다.
ex) 블로그 어플리케이션에서 볼 수 있는 view
-블로그 홈페이지: 최근의 entries를 보여준다
-'detail' 페이지 입구: single entry의 링크
-year-based 페이지
-month-based 페이지 등등... (왜 이런 예시를 들었는지 잘 모르겠다)
poll application에서는 4가지 view를 만들것이다.
- Question 'index' page: 가장 최근의 questoins들을 보여줌
- Question 'detail' page: question text를 투표 폼과 함꼐 보여줌
- Question 'results' page: 특정 질문에 대한 결과를 보여줌
- Vote action: 특정 질문 내 특정 선택에 대한 투표
장고에서 web page나 다른 컨텐츠들은 views를 통해서 전달된다. 각각의 view는 단순한 파이썬 function으로 구성된다. (CBV-class-based views인 경우에는 method)
장고는 URL에 맞는 view를 선택한다. (정확하게는 domain name 다음의 URL)
URL 패턴은 general form of URL: ex) /newsarchive/<year>/<month>/
자세한 내용은 장고의 django.urls(https://docs.djangoproject.com/en/1.10/ref/urlresolvers/#module-django.urls) 참고
Writing more views
polls.views.py에 몇 개의 views를 더 추가할 것이다.
-------------------
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)
-------------------
detail, result, vote 뷰를 추가해 주었다.
추가한 view들을 polls.urls 모듈에 url()를 추가해서 연결시킨다
polls/urls.py를 열고
-------------------
from django.conf.urls import url
from . import views
urlpatterns = [
# ex: /polls/
url(r'^$', views.index, name='index'),
# ex: /polls/5/
url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
# ex: /polls/5/results/
url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
# ex: /polls/5/vote/
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]
-----------------
로 수정해준다. 기초적인 수준의 정규표현식이 필요하다.
각각의 url 예시이다.
-처음 index의 url은 => localhost:8000/polls/
-detail => localhost:8000/polls/1/ (숫자)
-results => localhost:8000/polls/1/results/
-vote => localhost:8000/polls/1/vote/
Write views that actually do something
view는 두가지 중 하나이다.
-HttpResponse object 반환: 요청된 페이지의 콘텐츠를 담고 있음
-Http404와 같은 예외
모든 장고는 HttpResponse를 필요로 한다(?)
왜냐면 편하기 때문에!
새로운 index() view를 만들자: 5개의 최신 poll questions을 콤마 (',')로나눠서 불러오는 view
polls/views.py를 불러와서
-----------
from django.http import HttpResponse
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([q.question_text for q in latest_question_list])
return HttpResponse(output)
# Leave the rest of the views (detail, results, vote) unchanged
-----------
를 추가한다.
여기에 문제가 있다: 페이지 디자인이 hard-coded,
=> Djanog의 템플릿 시스템을 통해 Python의 디자인을 템플릿으로 나눔
- templates 폴더를 polls 디렉토리에 만듬
'TEMPLATES' 세팅은 장고가 어떻게 템플릿을 불러오고 사용하는지를 나타냄.
default settiing file: DjangoTemplate ??
- templates 디렉토리에 polls 디렉토리를 만들고 안에 index.html 파일을 만들기
polls/temlplates/polls/index.html 처럼
#Template namespacing
#Now we might be able to get away with putting our templates directly in polls/templates (rather than creating another polls subdirectory), but it would actually be a bad idea. Django will choose the first template it finds whose name matches, and if you had a template with the same name in a different application, Django would be unable to distinguish between them. We need to be able to point Django at the right one, and the easiest way to ensure this is by namespacing them. That is, by putting those templates inside another directory named for the application itself.
(더 읽어보자..)
index.html에 다음 코드를 넣는다 (템플릿 생성)
-----------
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
-----------
다음은 polls/views.py에서 index view를 업데이트 한다.
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))
------------
를 추가한다.
이 코드는 polls/index.html 템플릿을 불러오는 코드이다.
즉, index를 불러오는 url(ex: localhost:8000/polls/)을 입력하면
=> polls/view.py 안의 index 함수 호출
=> index 함수에서 loarder 함수를 통해 polls/index.html 호출
과 같은 순서로 진행이 된다.
A shortcut: render()¶
템플릿을 불러오고, context를 채우고 HttpResponse object를 불러오는 방식의 숏컷을 제공한다.
다시 써진 index()이다. (polls/viewsw.py 안에)
------
from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
------
loader이나 HttpResponse를 불러오지 않고 views를 만들수 있다.
render() 기능은 첫 argument로 request object를 받고(request),
두번째 argument로 HttpResponse를 받고 ('polls/index.html')
세번째 optional argument를 받는다.
polls/view.py에
'backend > django' 카테고리의 다른 글
django tutorial: Testing(테스팅) (part5) (0) | 2017.03.03 |
---|---|
django tutorial: form, generic view 사용 (part4) (0) | 2017.03.03 |
django tutorial: API 사용해보기 & django admin 사용법 (part2) (0) | 2017.03.02 |
postgresql과 django 연동 (장고 데이터베이스 연동하기) (0) | 2017.03.01 |
django를 위한 postgresql 설치하기 (0) | 2017.03.01 |