Skip to main content

A polymorphic mptt structure to display content in a tree.

Project description

django-polymorphic-tree

This is a stand alone module, which provides:

“ A polymorphic structure to display content in a tree. “

In other words, this module provides a node tree, where each node can be a different model type. This allows you to freely structure tree data. For example:

  • Build a tree of a root node, category nodes, leaf nodes, each with custom fields.

  • Build a todo list of projects, categories and items.

  • Build a book of chapters, sections, and pages.

Origin

This module was extracted out of django-fluent-pages because it turned out to serve a generic purpose. This was done during contract work at Leukeleu (also known for their involvement in django-fiber).

Installation

First install the module, preferably in a virtual environment:

pip install django-polymorphic-tree

Or install the current repository:

pip install -e git+https://github.com/edoburu/django-polymorphic-tree.git#egg=django-polymorphic-tree

The main dependencies are django-mptt and django-polymorphic, which will be automatically installed.

Configuration

Next, create a project which uses the application:

cd ..
django-admin.py startproject demo

Add the following to settings.py:

INSTALLED_APPS += (
    'polymorphic_tree',
    'polymorphic',
    'mptt',
)

Usage

The main feature of this module is creating a tree of custom node types. It boils down to creating a application with 2 files:

The models.py file should define the custom node type, and any fields it has:

from django.db import models
from django.utils.translation import ugettext_lazy as _
from polymorphic_tree.models import PolymorphicMPTTModel, PolymorphicTreeForeignKey


# A base model for the tree:

class BaseTreeNode(PolymorphicMPTTModel):
    parent = PolymorphicTreeForeignKey('self', blank=True, null=True, related_name='children', verbose_name=_('parent'))
    title = models.CharField(_("Title"), max_length=200)

    class Meta:
        verbose_name = _("Tree node")
        verbose_name_plural = _("Tree nodes")


# Create 3 derived models for the tree nodes:

class CategoryNode(BaseTreeNode):
    opening_title = models.CharField(_("Opening title"), max_length=200)
    opening_image = models.ImageField(_("Opening image"), upload_to='images')

    class Meta:
        verbose_name = _("Category node")
        verbose_name_plural = _("Category nodes")


class TextNode(BaseTreeNode):
    extra_text = models.TextField()

    # Extra settings:
    can_have_children = False

    class Meta:
        verbose_name = _("Text node")
        verbose_name_plural = _("Text nodes")


class ImageNode(BaseTreeNode):
    image = models.ImageField(_("Image"), upload_to='images')

    class Meta:
        verbose_name = _("Image node")
        verbose_name_plural = _("Image nodes")

The admin.py file should define the admin, both for the child nodes and parent:

from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from polymorphic_tree.admin import PolymorphicMPTTParentModelAdmin, PolymorphicMPTTChildModelAdmin
from . import models


# The common admin functionality for all derived models:

class BaseChildAdmin(PolymorphicMPTTChildModelAdmin):
    GENERAL_FIELDSET = (None, {
        'fields': ('parent', 'title'),
    })

    base_model = models.BaseTreeNode
    base_fieldsets = (
        GENERAL_FIELDSET,
    )


# Optionally some custom admin code

class TextNodeAdmin(BaseChildAdmin):
    pass


# Create the parent admin that combines it all:

class TreeNodeParentAdmin(PolymorphicMPTTParentModelAdmin):
    base_model = models.BaseTreeNode
    child_models = (
        (models.CategoryNode, BaseChildAdmin),
        (models.TextNode, TextNodeAdmin),  # custom admin allows custom edit/delete view.
        (models.ImageNode, BaseChildAdmin),
    )

    list_display = ('title', 'actions_column',)

    class Media:
        css = {
            'all': ('admin/treenode/admin.css',)
        }


admin.site.register(models.BaseTreeNode, TreeNodeParentAdmin)

The child_models attribute defines which admin interface is loaded for hte edit and delete page. The list view is still rendered by the parent admin.

Todo

  • Sphinx Documentation

  • Unit tests

  • Example app

  • A final review of class names (hence the alpha version tag, but we will provide aliases for the old names)

  • Getting the polymorphic-admin code merged upstream back into django-polymorphic (see pull request #10).

Contributing

This module is designed to be generic. In case there is anything you didn’t like about it, or think it’s not flexible enough, please let us know. We’d love to improve it!

If you have any other valuable contribution, suggestion or idea, please let us know as well because we will look into it. Pull requests are welcome too. :-)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-polymorphic-tree-1.0.1.tar.gz (132.8 kB view details)

Uploaded Source

Built Distribution

django_polymorphic_tree-1.0.1-py2.py3-none-any.whl (147.5 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file django-polymorphic-tree-1.0.1.tar.gz.

File metadata

File hashes

Hashes for django-polymorphic-tree-1.0.1.tar.gz
Algorithm Hash digest
SHA256 2bad520ccbe1c7e764c9a17fd0b7787c59a33a1365875f56c3419d33ac355bde
MD5 048bf44a0829c9d0f2241f85185f2254
BLAKE2b-256 f65597930eecef2430bfb3f55ec7b88ee6e23c32ef8db552acb9ab102e73aad5

See more details on using hashes here.

File details

Details for the file django_polymorphic_tree-1.0.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_polymorphic_tree-1.0.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 7a903cdc340ec4eeab19d3c3483048ba50d17a15c292959b174cc47869c3c0cf
MD5 4a1e006c712b6f14e882648f39959646
BLAKE2b-256 e76a2f349e20f8b3268fe90ebb348e8c6d8ca59b2f7713ca4baad7875b484b90

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page