복붙노트

[PYTHON] 어떻게 사용자 정의 AdminSite 클래스를 사용합니까?

PYTHON

어떻게 사용자 정의 AdminSite 클래스를 사용합니까?

내 자신의 django.contrib.admin.sites.AdminSite를 구현하는 가장 좋은 방법은 무엇입니까?

사실 나는 django.contrib.admin.autodiscover에서 INSTALLED_APPS의 등록에 문제가 있습니다. urls.py에서 내 사용자 지정 AdminSite 클래스를 사용하면 관리 페이지에 아무 앱도 표시되지 않습니다.

나는 이것을 litte hack으로 고쳤다. 나는이 수업을 썼다.

from django.contrib.admin.sites import site as default_site

class AdminSiteRegistryFix( object ):
    '''
    This fix links the '_registry' property to the orginal AdminSites
    '_registry' property. This is necessary, because of the character of
    the admins 'autodiscover' function. Otherwise the admin site will say,
    that you havn't permission to edit anything.
    '''

    def _registry_getter(self):
        return default_site._registry

    def _registry_setter(self,value):
        default_site._registry = value

    _registry = property(_registry_getter, _registry_setter)

그리고 다음과 같이 내 사용자 지정 AdminSite를 구현하십시오.

from wltrweb.hacks.django.admin import AdminSiteRegistryFix
from django.contrib.admin import AdminSite

class MyAdminSite( AdminSite, AdminSiteRegistryFix ):
    # do some magic
    pass        


site = MyAdminSite()

그래서 나는 urls.py를 위해이 사이트를 사용할 수있다.

누구든지 더 좋은 방법을 알고 있습니까? 밑줄로 시작하는 var에 액세스하기 때문에 해킹 이상은 아닙니다. 나는 해킹을 좋아하지 않는다.

편집 : 또 다른 방법은 django.contrib.admin.autodiscover 함수를 다시 작성하는 것이지만이 경우에는 중복 코드가 생깁니다.

해결법

  1. ==============================

    1.https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#customizing-the-adminsite-class에서 인용

    https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#customizing-the-adminsite-class에서 인용

    가장 명확한 접근 방법이라고 생각하지만 앱 admin.py 파일에서 등록 코드를 변경해야한다는 의미이기도합니다.

    가정은 사용자 지정 관리 사이트 작성을 시작하면 거의 프로젝트별로 이루어지며 어떤 앱을 포함할지 미리 알 수 있습니다.

    위의 해킹 작업을 원하지 않는다면이 두 가지 옵션 만 볼 수 있습니다. 모든 등록 호출을 사용자 정의 관리 사이트로 바꾸거나 adminsite 모듈에 명시 적으로 모델을 등록하십시오.

  2. ==============================

    2.django.contrib.admin.AdminSite에서 파생 된 사용자 정의 클래스를 프로젝트의 관리 사이트에 사용하여 새 클래스로 모델을 등록하는 사용자 정의 등록 코드를 작성할 필요가 없습니다. 자신의 모델로 타사 앱을 사용할 때 모델이이 앱에서 추가되거나 제거 되었기 때문에 맞춤 등록 코드를 편집하지 않아도됩니다.

    django.contrib.admin.AdminSite에서 파생 된 사용자 정의 클래스를 프로젝트의 관리 사이트에 사용하여 새 클래스로 모델을 등록하는 사용자 정의 등록 코드를 작성할 필요가 없습니다. 자신의 모델로 타사 앱을 사용할 때 모델이이 앱에서 추가되거나 제거 되었기 때문에 맞춤 등록 코드를 편집하지 않아도됩니다.

    django.contrib.admin의 autodiscover 함수가 호출되기 전에 admin 사이트에 사용 된 기본 클래스로 만든 인스턴스를 자신의 클래스로 만든 인스턴스로 전환해야합니다. 나는 이것을 다음과 같이 행한다 :

  3. ==============================

    3.Django 2.1부터는 'out-of-the-box'해결책이 있습니다 : https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#overriding-the-default-admin-site

    Django 2.1부터는 'out-of-the-box'해결책이 있습니다 : https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#overriding-the-default-admin-site

    from django.contrib import admin
    
    class MyAdminSite(admin.AdminSite):
    ...
    

    커스텀 어드민 사이트를 교체하는 것은 이제 설치된 앱에 자신의 AdminConfig를 추가하여 수행됩니다.

    from django.contrib.admin.apps import AdminConfig
    
    class MyAdminConfig(AdminConfig):
        default_site = 'myproject.admin.MyAdminSite'
    

    INSTALLED_APPS = [
        ...
        'myproject.apps.MyAdminConfig',  # replaces 'django.contrib.admin'
        ...
    ]
    

    AdminConfig와 SimpleAdminConfig의 차이점에 유의하십시오. 여기서 Admin.autodiscover ()는 admin.autodiscover ()를 트리거하지 않습니다. 현재 프로젝트에서이 솔루션을 사용하고 있습니다.

  4. from https://stackoverflow.com/questions/4877335/how-to-use-custom-adminsite-class by cc-by-sa and MIT license