django-mptt로 tree 구조 만들기.

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

    • red on 2022년 4월 29일 at 10:05 오후
    • Reply

    ancestors = [i.slug for i in ancistors]

    위 코드에 ancistors가 ancestors 아닌가요?

    1. 네.. 맞네요..
      수정했습니다.
      지적 고맙습니다.

답글 남기기

Your email address will not be published.