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 %}