Django

15. apps.py 활용 맛보기 - 앱 이름 하드코딩 개선하기

테니드2 2021. 4. 10. 13:53

프로젝트의 전반적인 설정을 담당하는 곳은 settings.py 이고 각 앱마다 필요한 항목의 대한 설정을 할 수 있는 곳은 apps.py 파일이다.

장고 공식 문서를 보면 apps.py 파일의 용도로 앱 이름에 대한 별칭(verbose_name)을 정의하거나 시그널(signal) 수신자를 등록하는 예시를 보여주고 있다.

 

현재 실습하고 있는 polls, books 라는 앱 이름을 하드코딩하고 있는데 apps.py를 활용하면 이 부분을 개선할 수 있다.

3가지 파일(apps.py, view.py, 템플릿 파일)을 수정한다.

 

- app.py

from django.apps import AppConfig


class BooksConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'books'
    verbose_name = 'Book-Author-Publisher App' #추가

 

- views.py

# views.py
from django.http import  HttpResponse
from django.views.generic import TemplateView
from django.apps import apps

class HomeView(TemplateView):
    template_name = "home.html"

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

if 'site-package' not in app.path :

외부 라이브러의 물리적 디렉토리 구조는 'site-packages'를 포함하고 있으므로, 내가 추가로 구성한 앱만을 딕셔너리에 추가하기 위함이다.

 

- home.html

{% extends "base.html" %}

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