Python Django:父类别不';显示在管理界面中

Python Django:父类别不';显示在管理界面中,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,问题: 在我打开任何菜单项之前,“父类别”列中会显示短划线符号。打开菜单项配置文件时,我会得到“父类别”项(请参见下面的admin.py) 打开菜单配置文件前后:和(注意父类别列) Mymodels.py:(注意家长id) Myadmin.py:() 问题:如何在不打开任何菜单项配置文件的情况下重写我的admin.py以显示父id项 我已经试过了,但效果不好。如果您有任何帮助,我们将不胜感激。在不更改您的模型的情况下,最简单的解决方案可能是在您的管理中添加一个parent方法,并使用它而不是列表

问题: 在我打开任何菜单项之前,“父类别”列中会显示短划线符号。打开菜单项配置文件时,我会得到“父类别”项(请参见下面的
admin.py

打开菜单配置文件前后:和(注意父类别列)

My
models.py
(注意
家长id

My
admin.py
()

问题:如何在不打开任何菜单项配置文件的情况下重写我的
admin.py
以显示
父id


我已经试过了,但效果不好。如果您有任何帮助,我们将不胜感激。

在不更改您的模型的情况下,最简单的解决方案可能是在您的管理中添加一个
parent
方法,并使用它而不是
列表显示中的“parent\u id”:

class MyMenu(admin.ModelAdmin):
    # ....
    def parent(self, obj):
        if obj.parent_id:
            return Menu.objects.get(pk=obj.parent_id).cat_title
        return ""

    list_display = ('cat_title', 'menu_title', 'parent', 'level')


    # Unrelated but you may also want to rewrite `get_choices`
    # in a simpler and more performant way:
    def get_choices(self):
        choices = models.Menu.objects.values_list("id", "cat_title"))
        return (('',''),) + tuple(choices) 
或者将
parent
作为
菜单上的方法或属性
模型:

class Menu(models.Model):
    # ...

    # you may want to use django's `cached_property` instead
    # but then you'll have to invalidate the cache when setting
    # (or unsetting) `.parent_id`
    @property
    def parent(self):
        if not self.parent_id:
            return None
        return Menu.objects.get(pk=self.parent_id)
并将“家长”添加到管理员的
列表\u显示中

但是,由于
菜单.parent\u id
实际上是
菜单
上的外键,因此正确的解决方案是在您的模型中声明它:

class Menu(models.Model):
    cat_title = models.CharField(max_length=150, verbose_name='Category title')
    menu_title = models.CharField(max_length=150, verbose_name='Menu title')
    parent = models.ForeignKey("self", blank=True, null=True, related_name="children")
    # etc

伟大的工作如我所料。谢谢
class Menu(models.Model):
    # ...

    # you may want to use django's `cached_property` instead
    # but then you'll have to invalidate the cache when setting
    # (or unsetting) `.parent_id`
    @property
    def parent(self):
        if not self.parent_id:
            return None
        return Menu.objects.get(pk=self.parent_id)
class Menu(models.Model):
    cat_title = models.CharField(max_length=150, verbose_name='Category title')
    menu_title = models.CharField(max_length=150, verbose_name='Menu title')
    parent = models.ForeignKey("self", blank=True, null=True, related_name="children")
    # etc