pythondjango-modelsdjango-admindjango-2.2django-polymorphic

Django-polymorphic-tree list_display object name from Contents Fields


I want to show name of my object on django-admin site, but I`m using django-polymorphic-tree and name of my object should be a text from Contents of this object, how can I do it?

I`ve already tried __str __() in polymorphic tree subclasses, and this is not working because django-polymorphic-tree is using list_display in admin.py and nothing else.

This is part of my models.py

class UserTimelines(PolymorphicMPTTModel):
    parent = PolymorphicTreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.CASCADE)

    to_show = ''

    class Meta(PolymorphicMPTTModel.Meta):
        verbose_name = "User Timeline"
        verbose_name_plural = "User Timelines"

class Node(UserTimelines):
    node_title = models.CharField(max_length=20, null=True)

    to_show = str(node_title)

    class Meta:
        verbose_name = "Node"
        verbose_name_plural = "Nodes"

class CategoryNode(UserTimelines):
    category_username = models.CharField(max_length=25, null=True)


    to_show = str(category_username) + ' timeline'

    class Meta:
        verbose_name = "Category node"
        verbose_name_plural = "Category nodes"

And part of admin.py

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

    base_model = UserTimelines
    base_fieldsets = (
        GENERAL_FIELDSET,
    )


class TreeNodeParentAdmin(PolymorphicMPTTParentModelAdmin):
    base_model = UserTimelines
    child_models = (
        (Node),
        (CategoryNode),
    )

    list_display = ('to_show', 'actions_column',)

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

admin.site.register((Node, CategoryNode),BaseChildAdmin)
admin.site.register(UserTimelines, TreeNodeParentAdmin)

Summarizing I just want to add to list_display, my 'to_show' variable from Node or CategoryNode class.


Solution

  • After few days, I make solution for this problem. It is simple anyway, You must do sth like this:

    Models.py:

    class UserTimelines(PolymorphicMPTTModel):
        parent = PolymorphicTreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.CASCADE)
    
        class Meta(PolymorphicMPTTModel.Meta):
            verbose_name = "User Timeline"
            verbose_name_plural = "User Timelines"
    
    class Node(UserTimelines):
        node_title = models.CharField(max_length=20, null=True)
    
        def __str__(self):
            return str(self.node_title)
    
        class Meta:
            verbose_name = "Node"
            verbose_name_plural = "Nodes"
    
    class CategoryNode(UserTimelines):
        category_username = models.CharField(max_length=25, null=True)
    
        def __str__(self):
            return str(self.category_username) + ' timetable'
    
        class Meta:
            verbose_name = "Category node"
            verbose_name_plural = "Category nodes"
    

    Admin.py:

    class BaseChildAdmin(PolymorphicMPTTChildModelAdmin):
        GENERAL_FIELDSET = ( None, {
            'fields' : ('parent',),
        })
    
        base_model = UserTimelines
        base_fieldsets = (
            GENERAL_FIELDSET,
        )
    
    
    class TreeNodeParentAdmin(PolymorphicMPTTParentModelAdmin):
        base_model = UserTimelines
        child_models = (
            (Node),
            (CategoryNode),
        )
    
        list_display = ('_show', 'actions_column',)
    
        def _show(self, obj):
            return str(UserTimelines.objects.get(pk=obj.pk).__str__())
    
        class Media:
        css = {
            'all' : ('admin/treenode/admin.css',)
        }
    
    admin.site.register((Node, CategoryNode),BaseChildAdmin)
    admin.site.register(UserTimelines, TreeNodeParentAdmin)
    

    I think this solution can help someone in the future so here you are.