簡體   English   中英

如果沒有 Django 中的“parent.attrib”語法,子 class 如何訪問其父屬性?

[英]How can a child class access its parent attributes without the “parent.attrib” syntax in Django?

我對 Django 完全感到困惑 我可以創建一個子 class ,它是 PostAdmin(admin.ModelAdmin) ,其父級為“admin.ModelAdmin”,並為“list_display”分配一個元組(提示:list_display 是 admin.ModelAdmin 的一個屬性類)在 PostAdmin 中而不寫“admin.ModelAdmin.list_display”......而在 python 中,為了解決父類的屬性需要使用“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)

我錯過了什么? I've searched a lot about python inheritance and couldn't understand the way the inheritance works in here...to be exact, How the child class (PostAdmin) assigns the "('title','publish', 'status' )" 到它的父級(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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM