질문목록, 질문상세 기능 구현

pybo에 핵심 기능인 질문 목록과 질문 상세 기능을 구현하자.

질문 목록 : 질문들을 게시물 목록으로 조회

질문 상세 : 한 건의 데이터를 상세히 조회

admin에서 쉽게 구현했던 기능들을, pybo에 구현해 보자.

질문 목록

질문 목록이 출력되도록 pybo\views.py 파일 수정

[파일명: C:\projects\yoursite\pybo\views.py] 아래 코드로 전체를 대체

from django.shortcuts import render
from .models import Question


def index(request):
    """
    pybo 목록 출력
    """
    question_list = Question.objects.order_by('-create_date')
    context = {'question_list': question_list}
    return render(request, 'pybo/question_list.html', context)

Question.objects 로 질문 목록 데이터를 가져옴

order_by 는 조회 결과를 정렬하는 함수. '-create_date'는 작성일시 역순 정렬의미. -없으면 순방향.

context는 [C:\projects\yoursite\config\settings.py]의 TEMPLATES에 context값으로 반환해줌.

render 함수는 파이썬데이터를 템플릿에 적용하여 HTML로 반환하는 함수.question_list 데이터를 pybo/question_list.html(템플릿) 파일에 적용하여 HTML을 리턴한다.

템플릿 디렉터리

render 함수에서 사용한 템플릿(pybo/question_list.html) 파일을 작성해야 한다.템플릿을 저장할 디렉터리는 config/settings.py 에 추가(등록)해줘야 한다.

[파일명 : C:\projects\yoursite\config\settings.py] #수정

 

(생략)
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [#BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
(생략)

BASE_DIR은 c:\projects\mysite 이므로 디렉터리를 만들자

(yoursite) C:\projects\yoursite>mkdir templates

템플릿들은 앱 디렉토리에서 관리하지 않고, 템플릿 디렉터리에서 관리하자.

(yoursite) C:\projects\yoursite\templates>mkdir pybo

pybo/question_list.html 파일을 만들고, 작성하자

[파일명 : C:\projects\yoursite\templates\pybo\question_list.html] 아래 코드로 작성

{% if question_list %}
    <ul>
    {% for question in question_list %}
        <li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>질문이 없습니다.</p>
{% endif %}

{% if question_list %}

question_list가 있다면 (question_list는 render 함수로 전달받은 "질문 목록" 데이터이다.)

{% for question in question_list %}

question_list 에서 하나씩 question 에 대입

{{ question.id }}

for문에 의해 대입된 question 객체의 id번호 출력

{{ question.subject }}

for문에 의해 대입된 question 객체의 제목 출력

Django 템플릿 언어

템플릿과 언어를 더 알고 싶다면 이 링크 클릭

 

Templates | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

테스트

질문 목록 기능 완성

질문 상세

'왜이러지?' 질문을 클릭하면

http://127.0.0.1:8000/pybo/2/의 URL을 가지고 있다.

URL이 동작할 수 있도록 pybo/urls.py 파일에서 매핑을 해주자.

[파일명: C:\projects\yoursite\pybo\urls.py] #라인 추가

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index),
    #path('<int:question_id>/', views.detail)
]

문자로 저장되어있는 id를 int로 숫자로 바꿔주고 mapping하여 views.detail 함수를 실행함

views.detail

pybo/views.py 파일에 detail 함수를 추가하자

[파일명: C:\projects\yoursite\pybo\views.py] 아래 코드를 다 추가

(생략)
def detail(request, question_id):
    """
    pybo 내용 출력
    """
    question = Question.objects.get(id=question_id)
    context = {'question': question}
    return render(request, 'pybo/question_detail.html', context)

detail 함수 호출시 매개변수로 request 외에 question_id도 전달됨.

http://localhost:8000/pybo/2/ 페이지가 요청되면, detail함수에 request와 2가 전달됨.

question_detail.html

pybo/question_detail.html 템플릿을 만들자.

[파일명: C:\projects\yoursite\templates\pybo\question_detail.html] 아래 코드로 파일생성

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

<div>
    {{ question.content }}
</div>

{{ question.subject }} 와 {{ question.content }} 는 detail함수에서 context로 넘겨받은 데이터.

테스트

오류 페이지

http://localhost:8000/pybo/30/ 를 요청해보자

위의 경우 브라우저에 전달되는 오류코드가 500인데 404를 전달해야 바람직하다

오류코드 설명
200 성공
500 서버오류
404 서버가 요청한 페이지를 찾을 수 없음

404 페이지를 출력하도록 detail 함수 수정

[파일명: C:\projects\yoursite\pybo\views.py] #라인 수정

from django.shortcuts import render#, get_object_or_404
from .models import Question

(... 생략 ...)

def detail(request, question_id):
    """
    pybo 내용 출력
    """
    question = #get_object_or_404(Question, pk=question_id)
    context = {'question': question}
    return render(request, 'pybo/question_detail.html', context)

pk는 Primary Key인 id를 의미한다.

http://localhost:8000/pybo/30/

 

장고 제네릭뷰

다음에 따로 조사 후 포스팅 할 계획이다

+ Recent posts