django-polymorphic-tree

A polymorphic mptt structure to display content in a tree
Download

django-polymorphic-tree Ranking & Summary

Advertisement

  • Rating:
  • License:
  • The Apache License 2.0
  • Price:
  • FREE
  • Publisher Name:
  • Diederik van der Boor
  • Publisher web site:
  • https://github.com/edoburu/

django-polymorphic-tree Tags


django-polymorphic-tree Description

django-polymorphic-tree 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.OriginThis 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).InstallationFirst install the module, preferably in a virtual environment:pip install django-polymorphic-treeOr install the current repository:pip install -e git+https://github.com/edoburu/django-polymorphic-tree.git#egg=django-polymorphic-treeThe main dependencies are django-mptt and django-polymorphic, which will be automatically installed.ConfigurationNext, create a project which uses the application:cd ..django-admin.py startproject demoAdd the following to settings.py:INSTALLED_APPS += ( 'polymorphic_tree', 'polymorphic', 'mptt',)UsageThe 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 modelsfrom 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 adminfrom django.utils.translation import ugettext_lazy as _from polymorphic_tree.admin import PolymorphicMPTTParentModelAdmin, PolymorphicMPTTChildModelAdminfrom . 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 codeclass 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.Product's homepage


django-polymorphic-tree Related Software