Computer Science/BackEnd

점프 투 장고 #2-2 | 장고 관리자, 조회와 템플릿, URL 별칭 익히기

토마토. 2022. 8. 15. 13:20

[참고] 2-03 장고 관리자 - 점프 투 장고 (wikidocs.net)

 

2-03 장고 관리자

* `[완성 소스]` : [github.com/pahkey/jump2django/tree/2-03](https://github.com/pahkey/jump2django/tr ...

wikidocs.net

 

장고 관리자

장고는 관리자 전용 페이지를 지원한다.

/admin 페이지에서 슈퍼 유저를 생성하고, /admin 페이지를 이용해 모델을 관리하고 검색하는 기능을 추가해보자! 

 

  • 슈퍼 유저
  • 장고 관리자 화면
  • 모델 관리
  • 모델 검색

 

  • step 1. 슈퍼 유저 생성

터미널에서 python manage,py createsuperuser로 슈퍼 유저를 생성한다. 

 python manage.py createsuperuser
Username (leave blank to use ''): 
Email address: 
Password: 
Password (again): 
Superuser created successfully.

 

다시 장고 서버를 구동하면, 

이제 localhost:8000/admin에 접속하여 생성한 계정으로 로그인해줄 수 있다. 

 

장고 관리자 화면은 위와 같다. 

 

  • step 2. 모델 관리
from django.contrib import admin
from .models import Question

# Register your models here.
admin.site.register(Question)

admin.py 파일에서 /admin 사이트에서 이용할 모델을 업데이트해준다. admin.site.register(Question)으로 Question 모델을 등록하는 것이다. 

 

다시 admin 페이지에 들어가면, Answer과 Questions 부분이 추가된 것을 확인할 수 있다. 

이 페이지에서 질문과 답변을 CRUD 할 수 있다. 

 

  • step 3. 모델 검색

관리자 화면에서 제목으로 질문 데이터를 검색해보자. 

from django.contrib import admin
from .models import Question, Answer

# Register your models here.

class QuestionAdmin(admin.ModelAdmin):
    search_fields=['subject']
class AnswerAdmin(admin.ModelAdmin):
    search_fields=['subject']
    
admin.site.register(Question, QuestionAdmin)
admin.site.register(Answer, AnswerAdmin)

admin.py 파일을 위와 같이 수정해준다. 

search_fields에 'subject' 항목을 추가해서 검색할 수 있게 해준다. 

 

search 기능이 추가되었다. 

 

조회와 템플릿

장고는 템플릿 태그라는 기능을 제공한다. 

템플릿 태그는 파이썬 코드를 HTML로 바꾸어서 빠르게 동적인 웹사이트를 만들 수 있게 해주는 기능이다. 

템플릿을 이용해서 파이썬 코드의 데이터를 HTML 화면으로 보여줄 수 있다. 

 

템플릿 태그를 이용해서, pybo 사이트의 질문 목록과 질문 상세 페이지를 개발해보자!

 

  • 질문 목록
    • 템플릿 디렉토리
    • 템플릿 파일
    • 템플릿 태그
    • 테스트
  • 질문 상세
    • urls.py
    • views.py
    • question_detail.html
    • 오류 페이지

 

질문 목록

 

질문 목록은 등록된 질문을 게시물 목록으로 조회하는 페이지다. 

 

  • step 1. 질문 목록 조회하도록 수정

<views.py 함수>

from django.shortcuts import render
from .models import Question
# Create your views here.


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

urls.py에서 /pybo에 views.index 함수를 매핑해둔 것을 기억할 것이다. 

이제 index 함수에서 이전처럼 "pybo입니다"라는 텍스트만 띄우는 것이 아니라, pybo에 등록된 질문 목록을 보여주고 싶다. 

이를 위해 index 함수를 수정해준다. 

 

우선 Question.objects.order_by()로 질문 목록을 가져오고, 

render(request, 'pybo/question_list.html', context)로 파이썬 데이터를 HTML 코드로 변환한다. 

이때 변환되는 question_list.html 파일을 템플릿이라고 한다. 

 

  • step 2. 템플릿 파일을 생성해보자

manage.py가 있는 위치에 template 디렉토리를 생성해준다. 

template 디렉토리 안에 모든 프로젝트가 공유하는 데이터를 담는 common 폴더와 pybo 프로젝트에서만 사용하는 pybo 폴더를 생성한다. 

그리고 질문 목록을 보여주는 템플릿으로 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 %}

템플릿은 html 확장자를 가지고 있지만, 일반적인 html과는 다르다. {% %}로 둘러싸인 문장이 템플릿 태그라서 조건문 반복문 등을 수행해준다. 예를 들면, {% if question_list %}가 question_list가 있을 때 안의 내용을 해준다는 뜻이다. 

 

템플릿 문법은 아래 사이트에서 확인할 수 있다. 

 

이렇게 간단한 질문 목록 사이트를 구현했다. 

 

 

 

 

URL 별칭
  • URL 하드코딩
  • URL 별칭
  • 템플릿에서 URL 별칭 사용하기
  • URL 네임스페이스

 

방금 구현한 템플릿 파일에서는 세부 목록으로 들어가는 URL을 하드코딩으로 만들어주었다. 

"/pybo/{{question.id}}"가 그것이다. 

 

<question_list.html>

<li><a href="/pybo/{{question.id}}/">{{question.subject}}</a></li>

 

그러나 URL 링크는 언제나 수정될 수 있기 때문에

"어쩌구"로 직접 하드코딩 하는 것이 아니라, 별칭을 이용해서 모든 url을 연결해주는 것이 필요하다. 

 

이를 위해서 name 속성을 부여하면 된다. 

 

<urls.py>파일을 살펴보자. 

<기존 urls.py>

from django.urls import path
from . import views

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

 

<수정 후 urls.py>

from django.urls import path
from . import views

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

127.0.0.1:8000/pybo를 'index'라 하고, 

'../pybo/2'에는 detail이라는 별칭을 붙인 것이다.