django-mptt, tree 구조를 쉽게(?) 구현하기.
1. 설치
pip install django-mptt
2. 설정하기(project/settings.py)
프로젝트의 settings.py에 아래 내용 추가
INSTALLED_APPS = [
#3'rd party APP
'mptt', #django-mptt, 이부분을 추가해야 한다.
# below is django default apps...
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
들여쓰기를 조정하고 싶은경우 아래 부분도 추가해줌(settings.py 맨 마지막에)
MPTT_ADMIN_LEVEL_INDENT = 5
3. 모델을 만든다.(app/models.py)
from mptt.models import MPTTModel, TreeForeignKey
class Category(MPTTModel):
name = models.CharField(max_length=64, unique=True)
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.CASCADE)
slug = models.SlugField()
class MPTTMeta:
order_insertion_by = ['name']
class Meta:
unique_together = (('parent', 'slug', ))
verbose_name_plural = 'categories'
def get_slug_list(self):
try:
ancestors = self.get_ancestors(include_self=True)
except:
ancestors = list()
else:
ancestors = [i.slug for i in ancestors]
slugs = list()
for i in range(len(ancestors)):
slugs.append('/'.join(ancestors[:i+1]))
return slugs
def __str__(self):
return self.name
4. 이제, 해당 데이타 모델에 적용하기위해, app/admin.py 에 아래 내용을 추가한다.
from django.contrib import admin # Register your models here. from .models import Category from mptt.admin import DraggableMPTTAdmin # 관리자페이지에서 카테고리를 트리형식으로 admin.site.register(Category, DraggableMPTTAdmin)
이제, admin 페이지에서 tree 구조의 category를 볼 수 있다.
사용자에게 보여주는 view는 별도로 구현해야한다.
사용자 뷰는 django-mptt 사용자 view를 참고.
2 comments
ancestors = [i.slug for i in ancistors]
위 코드에 ancistors가 ancestors 아닌가요?
Author
네.. 맞네요..
수정했습니다.
지적 고맙습니다.