Tutorial, Django documents 03

이도현·2023년 8월 11일
0

1. 개요

  • view는 일반적으로 특정한 기능을 제공하고 특정한 템플릿을 가진 Djnago 애플리케이션에 있는 웹페이지의 “type”입니다.
  • Django에서는 웹페이지와 기타 콘텐츠가 view로 전달됩니다. 각 view는 python 함수(Ehsms 클래스 기반 view의 경우 메소드)로 표현됩니다. Djnago는 요청한 URL(더 정확하게 말하면 도메인 이름 뒤의 URL부분을 확인하여 보기를 선택)

2. 뷰 추가하기

  • polls/views.py에 view를 추가
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 qusetino %s."
	return HttpResponse(response % question_id)

def vote(request,question_id):
	return HttpResponse("You're voting on question %s" % question_id)
  • path()호출 추기하기
# polls.urls
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')

3. 뷰의 기능 추가하기

  • 뷰는 데이터베이스의 레코드를 읽을 수 있다. 템플릿 시스템을 이용할 수 있다.(PDF를 생성하거나, XML을 출력하거나 실시간으로 ZIP파일을 만들 수 있습니다.)
from django.http import HttpResponse

from .models import Question

def index(request):
	latest_qusetion_lsit = Question.objects.order_by('-pub_date')[:5]
	output = ', '.join([q.question_text for q in latest_question_list])
	return HttpResponse(output)
  • 페이지의 디자인 방식을 바꾸고 싶다면 템플릿을 작성해야 한다.
  • settings.py.Insttalled_apps 디렉토리이의 templates를 탐색하도록 한다.
  • polls/templates/polls/index.html 생성
{% if lastest_question_list %}
	<ul>
	{% for question in latest_question_list %}
		<li><a href = "/polls/{{ question.id }}/">
		{{ question.questino_list }}</a></li>
	{% endfor %}
		<p>No polls are available.</p>
{% endif %}
  • view 업데이트
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))

4. render()

  • 탬플릿에 context를 채워 넣어 표현한 결과를 HttpResponse 객체와 함께 돌려주는 구문은 자주 쓰는 용법, 따라서 이런 표현을 쉽게 표현할 수 있도록 단축기능(shortcuts)를 제공합니다.
#polls/views.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)

5. 404 Error 일으키기

# polls.views.py

from django.http import Http404
from django.shortcuts import render

from .models import Question
# ...
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, 'polls/detail.html', {'question': question})
  • 뷰는 요청된 질문의 ID가 없을 경우 HTTP404 예외를 발생
  • polls/detail.html을 생성해 주어야 합니다.

5. get_object_or_404()

  • 객체가 존재하지 않을 때 get()을 사용하여 http404 예외를 발생시키는 것은 자주 싸용하는 용법’
  • get_object_or_404(): 모델을 인자로 받고 , 키워드들을 get()에 넘김,만약 객체가 존재하지 않을 경우, Http404 에러 발생
from django.shortcuts import get_object_or_404, render

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

6. 템플릿 시스템 사용하기

# polls/templates/polls/detail.html
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
	<li>{{choice.choice_text }}</li>
{% endfor %}
</ul>

7. 템플릿에서 하드코딩된 URL제거하기

  • polls.urls 모듈의 path()함수에서 인수의 이름을 정의했으므로

    {% url %}template tag를 사용하여 하드코딩을 막을 수 있다.

8. url의 이름공간 정하기

  • 여러 개의 앱을 사용할 때 {% url %}이 어떤 앱의 뷰에서 URL을 생성할 지 아는 방법은 URLconf에 이름 공간을 추가하는 것 입니다.
# polls/urls.py

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>/results/', views.results, name='results'),
    path('<int:question_id>/vote/', views.vote, name='vote'),
]
  • 이렇게 app_name = ‘앱 이름’을 정의하면 네임스페이스 기능을 사용할 수 있다.
#polls/index.html
<li><a href="{% url 'polls:detail' question.id %}">
{{ question.question_text }}</a></li>
profile
좋은 지식 나누어요

0개의 댓글