웹을 공부하면서 알아가는 중’ 시리즈

[파이썬 웹프로그래밍] Chap 5. 프로젝트 첫 페이지 만들기

  • 0
  • 0
0
0

첫 페이지인 루트(/) URL에 대한 처리 로직을 코딩한다.

1. 프로젝트 첫 페이지 설계

로직을 설계하면 아래 그림과 같다.

테이블은 변경사항이 없으므로, 화면 UI 및 뷰의 흐름만 설계한다.

A. UI 설계

![[Chap 5. 프로젝트 첫 페이지 만들기_UI설계_21.07.23.png]]

B. 뷰 흐름

![[Chap 5. 프로젝트 첫 페이지 만들기_뷰흐름_21.07.23.png]]

2. URLconf 코딩하기

애플리케이션에 대한 URL이 아니라 프로젝트에 대한 URL이므로 mysite/urls.py 파일에 루트(/) URL 및 임포트 문장만 추가.


(...)

from mysite import views  
  
urlpatterns = [  
    
    (...)
    
    path('', views.HomeView.as_view(), name='home'),  
    
    (...)
    
]

3. View 코딩하기

프로젝트와 관련된 뷰이므로 mysite/views.py 파일에 코딩

A. views.py


from django.views.generic.base import TemplateView  
  
#--- TemplateView  
  
class HomeView(TemplateView):  
    template_name = 'home.html'  
  
 def get_context_data(self, **kwargs):  
        context = super().get_context_data(**kwargs)  
        context['app_list'] = ['polls', 'books']  
  
        return context

a. TemplateView 클래스 임포트

from django.views.generic.base import TemplateView  

클래스형 제네릭 뷰를 사용하기 위해 Template 클래스를 임포트.

b. TemplateView 제네릭 뷰 상속

class HomeView(TemplateView):  

TemplateView를 사용하는 경우에는 필수적으로 template_name 클래스 변수를 오버라이딩해서 지정해줘야 한다.

템플릿 시스템으로 넘겨줄 컨텍스트 변수가 있는 경우에는 get_context_data() 메소드를 오버라이딩해서 정의해주면 된다.

c. get_context_data() 메소드

 def get_context_data(self, **kwargs):  
        context = super().get_context_data(**kwargs)  
        context['app_list'] = ['polls', 'books']  
  
        return context

반드시 첫 줄에 super() 메소드 호출해야 함.

mysite 프로젝트 하위에 있는 애플리케이션들의 리스트를 보여주기 위해 컨텍스트 변수 app_list에 담아서 템플릿 시스템에 넘겨준다. (하드코딩)

return 문장도 필수

4. Template 코딩하기

home.html 템플릿은 개별 애플리케이션 템플릿이 아니라 프로젝트 템플릿이므로, 상속에 사용하는 부모 템플릿의 위치와 동일한 위치에 생성한다.

A. home.html


{% extends "base.html" %}  
  
{% block content %}  
    <h2>mildsalmon Django Applications</h2>  
 <ul> {% for appname in app_list %}  
{% with appname|add:":"|add:"index" as urlvar %}  
        <li><a href="{% url urlvar %}">{{ appname }}</a></li>  
{% endwith %}  
        {% endfor %}  
    </ul>  
{% endblock content %}

a. {% with %} 태그

{% with appname|add:":"|add:"index" as urlvar %}  

add 템플릿 필터를 사용하여 애플리케이션명에 필요한 문자열을 붙여준다.

만약, 애플리케이션명이 books라면 urlvar는 books:index가 된다.

5. apps.py 활용 맛보기

  • settings.py

    • 프로젝트의 전반적인 항목들을 설정하는 곳
  • apps.py

    • 각 앱마다 필요한 항목을 설정할 수 있는 곳
    • 앱 이름에 대한 별칭(verbose_name)을 정의, 시그널(signal) 수신자 등록
    • path, label 등의 속성도 있다는데 뭔지는 모르겠음

[[Chap 5. 프로젝트 첫 페이지 만들기#c get_context_data 메소드]]에서 앱 이름을 polls, books로 하드코딩하는 부분을 apps.py를 활용하여 개선할 수 있다.

A. apps.py


from django.apps import AppConfig  
  
  
class BooksConfig(AppConfig):  
    
    (...)
    
    verbose_name = 'Book-Author-Publisher App'

B. views.py


(...)

from django.apps import apps  
  
#--- TemplateView  
  
class HomeView(TemplateView):  
    
    (...)
  
 def get_context_data(self, **kwargs):  
        
        (...)
        
        # context['app_list'] = ['polls', 'books']  
  
        dictVerbose = {}  
        for app in apps.get_app_configs():  
            if 'site-packages' not in app.path:  
                dictVerbose[app.label] = app.verbose_name  
        context['verbose_dict'] = dictVerbose  
  
        return context

a. apps 객체 활용

        for app in apps.get_app_configs():  
            if 'site-packages' not in app.path:  
                dictVerbose[app.label] = app.verbose_name  
        context['verbose_dict'] = dictVerbose  

  • Line 1.

    • apps 객체의 get_app_configs() 메소드를 호출하면, settings.py 파일의 INSTALLED_APPS에 등록된 각 앱의 설정 클래스들을 담은 리스트를 반환한다.
  • Line 2.

    • app은 각 앱의 설정 클래스를 의미한다.
    • app.path는 각 설정 클래스의 path 속성으로, 애플리케이션 디렉토리의 물리적 경로를 의미한다.
    • 물리적 경로에 site-packages 문자열이 들어있으면 외부 라이브러리 앱을 의미
  • Line 4.

    • verbose_dict 컨텍스트 변수에 dictVerbose 사전을 대입한다.

C. home.html


{% extends "base.html" %}  
  
{% block content %}  
    <h2>mildsalmon Django Applications</h2>  
<!--    <ul>-->  
<!--        {% for appname in app_list %}-->  
<!--{% with appname|add:":"|add:"index" as urlvar %}-->  
<!--        <li><a href="{% url urlvar %}">{{ appname }}</a></li>-->  
<!--{% endwith %}-->  
<!--        {% endfor %}-->  
<!--    </ul>-->  
     <ul>  
         {% for key, value in verbose_dict.items %}  
            <li><a href="{% url key|add:':index'%}">{{ value }}</a></li>  
         {% endfor %}  
    </ul>  
{% endblock content %}

a. 뷰로부터 전달받은 컨텍스트 변수 사용하기

     <ul>  
         {% for key, value in verbose_dict.items %}  
            <li><a href="{% url key|add:':index'%}">{{ value }}</a></li>  
         {% endfor %}  
    </ul> 

  • Line 2.
    • 컨텍스트 변수 verbose_dict 사전을 순회하기 위해 items() 메소드를 호출한다.
    • 템플릿 문법에서는 함수 호출을 의미하는 ()를 사용하지 않는다.
    • key에는 설정 클래스의 label 속성값이 있다.
    • value에는 설정 클래스의 verbose_name 속성값이 있다.

참고문헌

김석훈, "Django로 배우는 쉽고 빠른 웹개발 파이썬 웹프로그래밍", 개정판, 4쇄, 한빛미디어, 2020년

#Django #애플리케이션 #root_page #UI #view #URLconf #Template #class #apps

0분전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.