child class 如何在 Django 中没有 "parent.attrib" 语法的情况下访问其 parent 属性?

How can a child class access its parent attributes without the "parent.attrib" syntax in Django?

我完全糊涂了 在 Django 中,我可以创建一个 child class,它是 PostAdmin(admin.ModelAdmin),其中“admin.ModelAdmin”作为其 parent,并将一个元组分配给“list_display"(提示:list_display 是 admin.ModelAdmin class 的属性)在 PostAdmin 中无需写入 "admin.ModelAdmin.list_display"...而在python 要解决 parent class 的属性,需要使用“parent.attrib”语法 事实是,当我尝试 admin.ModelAdmin.list_display 时,它给了我错误!

这是我的“admin.py”中的代码:

from django.contrib import admin

# Register your models here.
from blog.models import post

class PostAdmin(admin.ModelAdmin):
      admin.ModelAdmin.list_display= ('title','publish', 'status')

admin.site.register(post,PostAdmin)

我错过了什么? 我已经搜索了很多关于 python 继承的信息,但无法理解继承在这里的工作方式......确切地说,如何 child class ( PostAdmin) 将“('title','publish', 'status')”分配给它的 parent(ModelAdmin)? 它是如何到达那里的?

这是我通过转到 ModelAdmin 的定义

找到的 admin.ModelAdmin 代码(由 Django 制作并位于 options.py)的某些部分

第一次list_display用在options.py(定义ModelAdmin的地方)

class BaseModelAdmin(metaclass=forms.MediaDefiningClass):
#...
def get_sortable_by(self, request):
        """Hook for specifying which fields can be sorted in the changelist."""
        return self.sortable_by if self.sortable_by is not None else self.get_list_display(request)
    """Encapsulate all admin options and functionality for a given model."""
#....

第二次遇到list_display

class ModelAdmin(BaseModelAdmin):

    list_display = ('__str__',)
    list_display_links = ()
    list_filter = ()
    list_select_related = False
    #.....etc

第三次遇到list_display

def get_changelist_instance(self, request):
        """
        Return a `ChangeList` instance based on `request`. May raise
        `IncorrectLookupParameters`.
        """
        list_display = self.get_list_display(request)
        list_display_links = self.get_list_display_links(request, list_display)
        # Add the action checkboxes if any actions are available.
        if self.get_actions(request):
            list_display = ['action_checkbox', *list_display]
        sortable_by = self.get_sortable_by(request)
        ChangeList = self.get_changelist(request)
        return ChangeList(
            request,
            self.model,
            list_display,
            list_display_links,
            self.get_list_filter(request),
            self.date_hierarchy,
            self.get_search_fields(request),
            self.get_list_select_related(request),
            self.list_per_page,
            self.list_max_show_all,
            self.list_editable,
            self,
            sortable_by,
        )

第四次相遇

    def get_list_display(self, request):
        """
        Return a sequence containing the fields to be displayed on the
        changelist.
        """
        return self.list_display

    def get_list_display_links(self, request, list_display):
        """
        Return a sequence containing the fields to be displayed as links
        on the changelist. The list_display parameter is the list of fields
        returned by get_list_display().
        """
        if self.list_display_links or self.list_display_links is None or not list_display:
            return self.list_display_links
        else:
            # Use only the first item in list_display as link
            return list(list_display)[:1]

你做错了。

from django.contrib import admin

# Register your models here.
from blog.models import post

class PostAdmin(admin.ModelAdmin):
      list_display= ('title','publish', 'status') ### Set the attribute on this class, not on the base class.
admin.site.register(post, PostAdmin)