Django Xadmin 공식 문서의 5 Xadmin 플러그인 제작

카탈로그
  • 1. 플러그인 원리
  • 템플릿 플러그인
  • 2. 플러그인 실례
  • 셋째, 플러그인 개발
  • 넷째, 플러그인 규범
  • 1. 플러그인 원리
    Xadmin의 플러그인 시스템 구조 디자인은 어느 정도에 wordpress의 디자인을 참고했다.Xadmin의 플러그인 시스템 구조를 이해하려면 먼저 XadminAdminView의 개념을 이해해야 한다.간단하게 말하면 Xadmin 시스템의 모든 페이지는 AdminView 대상이 되돌아오는 HttpResponse 결과이다.Xadmin의 플러그인 시스템이 하는 일은 AdminView 운행 과정에서 실행하는 논리를 바꾸거나 되돌아오는 결과를 바꾸어 기존 기능을 수정하거나 강화하는 효과가 있다.다음은 전체 플러그인이 제작 완료부터 실제 운행까지의 전체 과정을 살펴본다.
    먼저 자체 플러그인 클래스, 플러그인 클래스 상속BaseAdminPlugin을 만들어야 합니다.
    class HelloWorldPlugin(BaseAdminPlugin):
        ...
    

    개발된 플러그인은 먼저 Xadmin에 등록해야 하며 예제 코드는 다음과 같습니다.
    # ListAdminView   Model     
    xadmin.site.register_plugin(HelloWorldPlugin, ListAdminView)
    

    그 중에서 플러그인의 등록과 사용은 참고할 수 있다xadmin.sites.AdminSite.register_plugin().
    플러그인을 Xadmin에 등록하면 Xadmin은 AdminView 실례를 만들 때 이 플러그인을 실례plugins 속성에 넣습니다.AdminView가 요청을 처리할 때 plugins의 플러그인 init_request() 방법을 하나씩 호출하고 플러그인은 이 방법에서 일반적으로 초기화된 작업을 하고 Boolean 값을 되돌려줍니다 AdminView 플러그인을 불러올 필요가 있는지 알려 줍니다.init_request() 방법이 False로 되돌아올 때 AdminView 이 플러그인을 불러오지 않습니다.예는 다음과 같습니다.
    class HelloWorldPlugin(BaseAdminPlugin):
        say_hello = False
        #         ``say_hello``      
        def init_request(self, *args, **kwargs):
            return bool(self.say_hello)
    

    상기 실례에서 플러그인은 자신의 say_hello 속성에 따라 자신이 불러올지 여부를 결정합니다.say_hello 속성이 계속 False 될 것 같습니다. 그러면 이 플러그인은 영원히 불러오지 않을 것입니다.사실 Xadmin은 플러그인 실례를 만들 때 OptionClass 같은 이름의 속성을 플러그인의 속성으로 바꿉니다.이렇게 하면 서로 다른 OptionClass 아래에서 서로 다른 플러그인 결과가 나올 수 있다. 실례는 다음과 같다.
    class ListAdminView(ModelAdminView):
        #                      
        @filter_hook
        def get_context(self):
            ...
    
    filter_hook() 장식 방법을 사용하는 과정에서 일정한 원칙에 따라 플러그인의 동명 방법을 집행하고 구체적인 정보는 이 장식기의 문서 내용을 조사한다.
    xadmin.views.base.filter_hook(func)
    
       AdminView               。              ,          :
    
    1.        plugins     ,             ;
    
    2.         priority     ;
    
    3.         ,          :
    
              ,AdminView                ;
    
                  __ ,   AdminView             ,   ,          ,          __()   ,            AdminView               ,   :
    
    def get_context(self, __):
        c = {'key': 'value'}
        c.update(__())
        return c
    
                   __ ,     AdminView   ,             ;
    
    4.               ;
    

    이 장식기의 실행 원칙에 따라 상기 예시ListAdminViewget_context의 반환 값을 수정하려면 플러그인에서 다음과 같은 코드를 실현할 수 있습니다.
    class HelloWorldPlugin(BaseAdminPlugin):
        #           ,   ListAdminView   get_context     
        def get_context(self, context):
            context.update({'hello_target': 'World!!'})
            return context
    

    플러그인이 AdminView 방법 앞에서 실행되기를 원하거나 AdminView 방법을 완전히 자신의 방법으로 대체하기를 원한다면:
    class HelloWorldPlugin(BaseAdminPlugin):
        #        __ 。   __    ListAdminView   get_context     ,   ,            。
        def get_context(self, __):
            context = {'hello_target': 'World!!'}
            #             AdminView    ,        
            context.update(__())
            return context
    

    이로써 가입된 플러그인은 AdminView 방법에 대한 완전한 제어를 실현하였다.
    템플릿 플러그인
    우리는 Django의 완전한 View는 템플릿을 포함하고, 템플릿은 View가 최종적으로 되돌아오는 HTML 내용을 생성하는 데 사용된다는 것을 알고 있습니다.물론 플러그인도 템플릿에 자신의 내용을 삽입할 수 있다.구체적으로 어떻게 실현되는지 봅시다.
    먼저 Xadmin의 템플릿 코드 예제 세션(change list.html)을 살펴보겠습니다.
    {% load xadmin %}
    ...
    
    {% csrf_token %} {% view_block 'results_top' %}
    {% if results %} ...

    view_block Tag 。 block_ + HTML , :

    class HelloWorldPlugin(BaseAdminPlugin):
        # context    TemplateContext, nodes               。
        #         HTML   ,          nodes    
        def block_results_top(self, context, nodes):
            return s"
    Hello %s
    " % context['hello_target']

    2. 플러그인 실례
    다음은 Xadmin의 전체 플러그 인 인스턴스를 살펴보겠습니다.
    from django.template import loader
    
    from xadmin.sites import site
    from xadmin.views import BaseAdminPlugin, ListAdminView
    
    REFRESH_VAR = '_refresh'
    
    #                   
    class RefreshPlugin(BaseAdminPlugin):
    
        #            ,       。      ``OptionClass``        
        refresh_times = []
    
        def init_request(self, *args, **kwargs):
            #                       
            return bool(self.refresh_times)
    
        #         Media    ,        js   。
        def get_media(self, media):
            if self.request.GET.get(REFRESH_VAR):
                #             ,      js       
                media.add_js([self.static('xadmin/js/refresh.js')])
            return media
    
        # Block Views
        #        HTML   ,      。
        def block_top_toolbar(self, context, nodes):
            current_refresh = self.request.GET.get(REFRESH_VAR)
            context.update({
                'has_refresh': bool(current_refresh),
                'clean_refresh_url': self.admin_view.get_query_string(remove=(REFRESH_VAR,)),
                'current_refresh': current_refresh,
                'refresh_times': [{
                    'time': r,
                    'url': self.admin_view.get_query_string({REFRESH_VAR: r}),
                    'selected': str(r) == current_refresh,
                } for r in self.refresh_times],
            })
            #     HTML      nodes    
            nodes.append(loader.render_to_string('xadmin/blocks/refresh.html', context_instance=context))
    #     
    site.register_plugin(RefreshPlugin, ListAdminView)
    

    마지막으로 이 코드를 적당한 곳에 불러와서 실행하도록 하는 것을 잊지 마세요.일반적인 상황에서, 너는 그것을adminx에 쓸 수 있다.py 파일에서 APP가 Django Settings의 INSTALL에 가입하기만 하면APPS에서 Xadmin은 자동으로 app 아래의 adminx를 실행합니다.py 파일.
    3. 플러그인 개발
    플러그인의 운행 원리를 이해한 후에 우리는 자신의 플러그인을 개발할 수 있다.우선 우리는 플러그인 클래스의 실용적인 방법을 이해해야 한다.플러그인은 계승BaseAdminPlugin클래스이고 이 클래스는 계승BaseAdminObject클래스이기 때문에 이 두 가지 방법은 모두 플러그인에서 사용할 수 있다.
    Xadmin은 플러그인을 만들 때 플러그인 인스턴스에 다음 속성을 자동으로 주입합니다.
  • request: Http Request
  • user: 현재 User 객체
  • args:View 방법의 args 매개 변수
  • kwargs:View 방법의 kwargs 매개 변수
  • admin_view: AdminView 인스턴스
  • admin_site: Xadmin의 adminsite 객체 인스턴스
  • AdminViewModelAdminView의 하위 클래스인 경우 다음 속성이 자동으로 주입됩니다.
  • 모델: 모델 개체
  • opts: Model의meta 속성
  • 다음은 어떤 기능의 플러그인을 만들 계획인지 생각해 보셔야 합니다.서로 다른 기능의 플러그인은 서로 다른 AdminView에 등록해야 할 수 있다. Xadmin 시스템의 주요AdminView는 다음과 같다.
  • BaseAdminView: 모든AdminView의 기본 클래스로 이 뷰에 등록된 플러그인은 모든AdminView에 영향을 줄 수 있습니다.
  • CommAdminView: 사용자가 로그인한 후에 표시되는 View는 모든 로그인 후 View의 기본 클래스입니다.이 View의 주요 역할은 시스템 메뉴, 사용자 정보 등 Xadmin의 공통 요소를 만드는 것입니다.플러그인은 이 View를 등록해서 이 정보를 수정할 수 있습니다.
  • 모델AdminView: 모델 기반AdminView의 기본 클래스로 등록된 플러그인은 모든 모델 기반View에 영향을 줄 수 있다.
  • ListAdminView: 모델 목록 페이지View;
  • ModelFormAdminView: Model 편집 페이지View;
  • CreateAdminView: Model에서 페이지 View를 만듭니다.
  • UpdateAdminView: 모델 수정 페이지 View;
  • DeleteAdminView:Model 페이지 뷰 삭제;
  • DetailAdminView: 모델 상세 정보 페이지 View;

  • 목표AdminView를 선택한 후 자신의 플러그인에 작성하여 수정하거나 강화해야 한다AdminView.그중 각AdminView이 차단할 수 있는 방법과 그 소개는 각AdminView의 문서를 참조하십시오.
    4. 플러그인 규범
    문서 템플릿:
    """
    Name
    ======
    
      
    ----
    
            
    
      
    ----
    
             
    
      
    ----
    
    .. image:: /images/plugins/action.png
    
      
    ----
    
             ,        .
    
      
    ----
    
             
    
    API
    ---
    .. autoclass:: XXX
    
    """
    

    ['플러그인 규범'은 홈페이지에서 개발자가 플러그인을 만드는 양식을 규범화하기 위해 통일적으로 제정한 것이다. 이해가 맞는지 모르겠지만 신의 조언을 받기를 바란다.]

    좋은 웹페이지 즐겨찾기