홍카나의 공부방

[DE 데브코스] 04.25 TIL - Django 템플릿 & 뷰 본문

Data Engineering/프로그래머스 데브코스

[DE 데브코스] 04.25 TIL - Django 템플릿 & 뷰

홍문관카페나무 2023. 4. 25. 17:23

View와 Template의 기본 사용 예시

# views.py:

from django.shortcuts import render
from django.http import HttpResponse

from polls.models import Question


def index(request):
    # 쿼리셋을 정리하기 위한 method = order_by. 내림차순이 default
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'first_question': latest_question_list[0]}
    return render(request, 'polls/index.html', context=context) # 템플릿 파일 렌더링


def some_url(request):
    return HttpResponse("you request some_url.")


# index.html
# context로 뷰에서 템플릿에 전달한 변수 명을 사용할 수 있음.
<ul>
    <li>{{first_question}}</li>
</ul>

 

  • {% for %}문이나 {% if %} 문으로 템플릿에서 제어문을 사용할수도 있다.
  • 템플릿에서 역참조를 이용하여 object를 표현할 수 있는데, 템플릿 제어문을 사용할 때는 callable 형식을 사용하지 않는다.
<!-- 역참조 및 템플릿 제어문 not callable 작성 예시 -->

<h1>{{question.question_text}}</h1>

<ul>
    {% for choice in question.choice_set.all %}
    <li>{{choice.choice_text}}</li>
    {% endfor %}
</ul>

 

  • 링크를 추가할 때 <a> 태그를 사용하게 되는데, 여러가지 방법이 있다.
  • url을 이용할 때는 urls.py의 appname과 path의 name을 참조해야 한다.
<!-- urls.py의 appname과 path의 name을 참조함. ex) polls:detail -->
<a href="{% url 'detail' q.id %}">{{q}}</a>
<a href="/polls/{{q.id}}">{{q}}</a>

 

 

ERROR - 404, 500

  • HTTP 404 에러는 보통 HTTP Request에서 찾을 수 없는 페이지나 자원을 요청했을 때 발생한다.
  • 분명 서버에 만들어둔 url이 없어서 404를 띄워야함에도 불구, 장고에서는 500 에러를 띄우는 경우가 있다.
  • objects.get(pk=id)로 객체를 찾을 수 없을 때 Django에서는 500 에러를 띄우는 것이다.
  • 이때는 try - except를 사용해서 강제로 404 Error를 띄우는 방법을 사용할 수 있다.
  • 혹은 django.shortcut의 get_object_or_404 method를 이용하여 404를 띄우면 된다.
def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})

 

FORM

  • 템플릿에서 특정 양식을 작성할때 <form> 태그를 사용하면 된다.
  • {% csrf token %}을 빼먹지 맙시다.
  • 아래와 같이 try-except를 활용하여 에러를 방어할 수 있다.
  • 에러를 방어할 때는 온갖 상상력을 발휘하여 코드를 작성해야 한다.
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': '선택이 없습니다.'})
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:index'))

 

 

반응형