# Admin

## API

class treebeard.admin.TreeAdmin(model, admin_site)

  Bases: `ModelAdmin`

  Django Admin class for treebeard.

  Example:

      from django.contrib import admin
      from treebeard.admin import TreeAdmin
      from treebeard.forms import movenodeform_factory
      from myproject.models import MyNode

      class MyAdmin(TreeAdmin):
          form = movenodeform_factory(MyNode)

      admin.site.register(MyNode, MyAdmin)

treebeard.admin.admin_factory(form_class)

  Dynamically build a TreeAdmin subclass for the given form class.

  Parameters:

    form_class

  Returns:

    A TreeAdmin subclass.

## Interface

The features of the admin interface will depend on the tree type.

### Advanced Interface

Materialized Path and Nested Sets trees have an AJAX interface based on FeinCMS, that includes features like drag&drop and an attractive interface.

### Basic Interface

Adjacency List trees have a basic admin interface.

### Model Detail Pages

If a model’s field values are modified, then it is necessary to add the fields ‘treebeard_position’ and ‘treebeard_ref_node_id’. Otherwise, it is not possible to create instances of the model.

Example:

>     class MyAdmin(TreeAdmin):
>         list_display = ('title', 'body', 'is_edited', 'timestamp', 'treebeard_position', 'treebeard_ref_node_id',)
>         form = movenodeform_factory(MyNode)

>     admin.site.register(MyNode, MyAdmin)

### Foreign keys and One-to-one relationships

If your project contains models that have a foreign key or one-to-one relationship with a tree model, you can leverage `TreeNodeChoiceField` to display the choices nicely in the Django admin. Given the following models:

>     class TreeNode(MP_Node):
>         ...

>     class RelatedModel(models.Model):
>         tree_node = models.ForeignKey("TreeNode")

You can configure the admin form for `RelatedModel` as follows for it to render the choices for `tree_node` in a nested list:

>     class RelatedModelAdminForm(forms.ModelForm):
>         tree_node = TreeNodeChoiceField(queryset=TreeNode.objects.all())

>     class RelatedModelAdmin(admin.ModelAdmin):
>         form = RelatedModelAdminForm

>     admin.site.register(MyNode, MyAdmin)

Warning

`TreeNodeChoiceField` should not be used with AL nodes, because they cannot be queried efficiently in this context.