django-adminlte3 – part 3
django-adminlte3와 django-mptt로 사이드바 tree 메뉴 만들기
django-mptt 설치와 설정은 django-mptt로 tree구조 만들기(https://blog.boxcorea.com/wp/archives/2605)를 참고하면 된다.
관리자페이지에서 아래와같은 tree구조를 만들었고, 이것을 사이드바에 tree 구조로 보이도록 view를 만들어본다.
project/app/urls.py에 url을 등록한다.
urlpatterns = [
path('category', CategoryView.as_view(), name='category'),
path('test/', TestView.as_view(), name='test'),
]
project/app/views.py 에 아래와 같이 view를 만든다.
class CategoryView(View):
template_name = 'chaser/category.html'
def get(self, request):
context = {
'categories': Category.objects.all(),
}
return render(request, self.template_name, context)
이제, project/templates/adminlte/lib/_main_sidebar.html 을 아래처럼 수정한다.
{% extends 'adminlte/lib/_main_sidebar.html' %}
{% block user_panel %}
{% endblock %}
{% block form %}
{% endblock %}
{% block nav_links_ul %}
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
{% block nav_links_outer %}
<li class="nav-header">{% block nav_heading %}CATEGORY{% endblock nav_heading%}</li>
{% block nav_links %}
<li class="nav-item has-tree-view ">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-object-group"></i> <p>Parents</p>
<p><i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview menu-open">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-circle"></i> child
</a>
</li>
</ul>
</li>
{% endblock nav_links %}
{% endblock nav_links_outer %}
</ul>
</nav>
{% endblock nav_links_ul %}
이제, 아래처럼 사이드바 메뉴가 바뀐 것을 볼 수 있다.

다음으로, CategoryView에서 전달받은 값을 사이드바에 표현하도록 템플릿을 수정한다.
project/templates/index.html이 /project/templates/adminlte/lib/_main_sidebar.html를 include 하기때문에, _main_sidebar.html에 아래 내용을 넣으면 전체 템플릿에 적용된다.
{% extends 'adminlte/lib/_main_sidebar.html' %}
{% load mptt_tags %}
{% block user_panel %}
{% endblock %}
{% block form %}
{% endblock %}
{% block nav_links_ul %}
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
{% block nav_links_outer %}
<li class="nav-header">{% block nav_heading %}MainMenu{% endblock nav_heading%}</li>
{% block nav_links %}
<li class="nav-item has-treeview ">
<a href="#" class="nav-link"><i class="nav-icon fas fa-circle text-warning"></i><p>Category</p><p><i class="right fas fa-angle-left"></i></p></a>
<ul class="nav nav-treeview">
{% recursetree categories %}
<li class="nav-item has-treeview">
<a href="#" class="nav-link"><i class="nav-icon nav-icon far fa-circle text-info"></i>{{node.name}}</a>
{% if not node.is_leaf_node %}
<ul class="nav nav-treeview">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
</li>
{% endblock nav_links %}
{% endblock nav_links_outer %}
</ul>
</nav>
{% endblock nav_links_ul %}
이제, 아래 그림처럼 사이드바 메뉴에 Category가 적용된 것을 확인 할 수 있다.
하지만, 위의 그림에서는 상위 카테고리인지 하위카테고리인지 확인이 쉽지 않다. 이것은 MPTT에서 indent설정이 적용되지 않기때문에, mptt indent와 관계없다.
https://adminlte.io/docs/3.0/components/main-sidebar.html 문서를 참고하여, nav-child-indent 속성을 ul class에 추가하면 된다.
즉, 12번 줄을 다음과 같이 수정한다.
<ul class="nav nav-pills nav-sidebar nav-child-indent flex-column" data-widget="treeview" role="menu" data-accordion="false">
이제, 아래 그림처럼 좀 더 직관적인 tree 구조의 메뉴를 볼 수 있다.

이후에 http://localhost:8000/test 에 접속하면, 변수를 찾을 수 없다는 메시지를 볼 수 있다.

이것은 test.html 이 index.html 템플릿을 확장하는데, categories 변수를 전달받지 못해서 그렇다.
이 문제를 해결하기 위해, TestView 클래스가 CategoryView를 상속받도록 코드를 수정한다.
project/app/views.py
class CategoryView(View):
template_name = 'index.html'
category = Category.objects.all()
def get(self, request):
context = {
'categories': self.category,
}
return render(request, self.template_name, context)
class TestView(CategoryView, TemplateView):
template_name = 'chaser/test.html'
하지만, TestView는 의도와는 다르게 제대로 작동하지 않는다.
그래서, CategoryView와 동일하지만 템플릿만 다른 코드를 작성했다.
class TestView(View):
template_name = 'chaser/test.html'
category = Category.objects.all()
def get(self, request):
context = {
'categories': self.category,
}
return render(request, self.template_name, context)
현재시점에서 django-adminlte3 문서가 나오지 않아서 사용하기에 조금 어려운 면이 있지만, 디자인은 위의 adminlte3 문서를 참고하고 블럭은 https://github.com/d-demirci/django-adminlte3/tree/master/adminlte3/templates/adminlte/lib
의 파일들을 참고하여 사용하면 될 것이다.



