apps.py?
django application을 생성하면 여러 파일들이 생기는데 그중 apps.py라는 파일이 있다. 이 파일은 프로젝트 디렉토리의 settings.py에 INSTALLED_APPS에 디폴트 app 클래스를 등록하여 프로젝트 애플리케이션을 등록해 사용하곤 한다.
아래와 같이 말이다.
위 사진을 보면 Books.Config라는 클래스를 INSTALLED_APPS에 등록해주어 사용한다.
apps.py의 활용
그렇다면 단지 apps.py는 이러한 용도만 있을까? 이외 용도가 더 있다. 예를 들어 홈화면을 만드는 코드라고 가정하자. 홈화면에는 각 모델들의 index페이지로 들어가는 링크들이 있다고 가정하자.
# Project Directory's : views.py
from django.views.generic.base 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']
return context
# Project Directory's : index.html
{% extends "base_books.html" %}
{% block content %}
<h2>Book Management System</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 %}
위 코드에서, Django Application의 리스트들인 polls, books 를 하드코딩하였다.
context['app_list'] = ['polls','books']
apps.py를 통해 이를 개선할 수 있다.
# books / apps.py
from django.apps import AppConfig
class BooksConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'books'
verbose_name = "Book-Author-Publisher App"
# polls / apps.py
from django.apps import AppConfig
class PollsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'polls'
verbose_name = 'Vote app'
우선 각 애플리케이션의 apps.py에 verbose_name이라는 클래스 변수를 정의해준다. 이는 app의 이름을 의미하는 예시 변수이다. 그리고 views.py를 아래와 같이 바꿔보자.
from django.views.generic.base 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)
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
위 코드를 해석해 보자. 우선 Class View중 TemplateView를 상속받았다. 그렇기 때문에 template_name 클래스 변수를 보여주고자 하는 template이름으로 재정의 하였고, context를 얻기 위해서 get_context_data메소드를 오버라이딩 한다. get_context_data 는 무조건 super().get_context_data(**kwargs)를 해주어야 한다는것을 잊지말자.
그 다음 dictVerbose 딕셔너리를 정의해준다. 이 딕셔너리는 위에서 지정한 앱들에 대해 (앱 이름) : (verbose) 형태로 저장하기 위한 딕셔너리이다. apps.get_app_configs() 메소드를 호출하게 되면 settings.py파일의 INSTALLED_APPS에 등록된 각 앱의 설정 클래스(apps.py)를 담은 리스트를 반환한다. 실제로 get_app_configs()메소드를 호출하면 아래와 같은 결과가 나오는것을 볼 수 있다. get_app_coinfigs 메소드가 궁금하면 아래 Document를 참조해보는것이 좋다.
https://docs.djangoproject.com/ko/4.0/ref/applications/#django.apps.apps.get_app_configs
그 다음 아래 조건문에서 'site-packages'가 없는 경우에 대해서만 dictVerbose에 딕셔너리를 등록하는것을 볼 수 있다. 물리적 경로에서 'site-packages' 문자열이 들어있으면 외부 라이브러리 앱이란 뜻이다. 여기에는 장고에서 기본적으로 제공하는 앱들도 포함이 된다. 각 앱별로 경로를 출력해보면 아래와 같이 나온다. 외부 애플리케이션들은 site-packages라는 부모 디렉토리 아래에 존재하는것을 볼 수 있다.(아래 앱들은 Django 내장 앱들이다)
딕셔너리에 키값으로 사용하는 app.label을 보자. app.label같은 경우에는 document에 클래스 변수중 'name' 변수와 동일한 의미를 가지는 필드라고 기재되어있다
https://docs.djangoproject.com/en/4.0/ref/applications/#django.apps.AppConfig.label
verbose_name은 아까 설정한 클래스변수의 값을 의미한다. 그 후 context변수에 dictVerbose를 등록해 준다. 이번에는 template을 변경해 주자.
#home.html
{% extends 'base.html' %}
{% block content %}
<h2>Djagno Application</h2>
<ul>
{% for key,value in verbose_dict.items %}
<li><a href="{% url key|add:':'|add:'index' %}">{{ value }}</a></li>
{% endfor %}
</ul>
{% endblock content %}
items는 딕셔너리에서 Key, Value를 Set타입으로 묶어 반환하는 메소드이다. 그리고 다시 실행해 보면 아래와 같이 아까 지정했던 Verbose_name값으로 출력되는것을 볼 수 있다.
'Back-End > Python Django' 카테고리의 다른 글
[Django] 함수형 View 클래스형 View로 변경해보기 (0) | 2022.03.06 |
---|---|
[Django] get_context_data() 메소드의 작동원리 (0) | 2022.03.05 |
[django] 클래스형 뷰 (0) | 2022.03.01 |
[Django] form클래스로 폼 생성하기 (0) | 2022.02.22 |
[Django] 템플릿 상속하기 (0) | 2022.02.22 |