2017-01-02 14 views
3

モデルの関連付けなしで管理者にカスタムページを追加しようとしています。モデルなしでdjangoの管理者にカスタムページを追加します。

これはこれまで私が達成したものです。

class MyCustomAdmin(AdminSite): 

    def get_urls(self): 
     from django.conf.urls import url 

     urls = super(MyCustomAdmin, self).get_urls() 
     urls += [ 
      url(r'^my_custom_view/$', self.admin_view(MyCustomView.as_view())) 
     ] 
     return urls 

class MyCustomView(View): 
    template_name = 'admin/myapp/views/my_custom_template.html' 

    def get(self, request): 
     return render(request, self.template_name, {}) 

    def post(self, request): 
     # Do something 
     pass 

admin_site = MyCustomAdmin() 

admin_site.register(MyModel1) 
admin_site.register(MyModel2) 
# etc... 

これは、実際に働いているが、問題は、このソリューションで、私はDjangoの管理インタフェース(アカウント、認証、socialaccounts、サイト)からいくつかのアプリを失うということです。

答えて

1

他の管理者がデフォルトのadmin.siteを使用しているためです。 admin.siteのデフォルト値を自分のas explained hereに完全に置き換える必要があります(read this tooにすることもできます)。

それとも、ただデフォルトadmin.site.get_urls()方法monkeypatchingでそれをピギースタイルの操作を行うことができます

from django.contrib import admin 

_admin_site_get_urls = admin.site.get_urls 

def get_urls():   
    from django.conf.urls import url 
    urls = _admin_site_get_urls() 
    urls += [ 
      url(r'^my_custom_view/$', 
       admin.site.admin_view(MyCustomView.as_view())) 
     ] 
    return urls 

admin.site.get_urls = get_urls 

免責事項:私はこの「ソリューションの不要な副作用のあらゆる種類の責任を負いませんが"、次のコードレビューであなたを偽っているあなたの同僚を含む(ただしこれに限定されません)。それは汚い解決策です。それは混乱です。それは悪臭を放つ。それは悪です。本当にやってはいけません。

+0

ご返信ありがとうございます。私はドキュメントを知っていて、django.contrib.adminをINSTALLED_APPSに組み込むことで、自動検出がまだ有効であると思っていました。私はメソッドget_urls()をオーバーライドするソリューションが本当に好きではなく、すべてのサードパーティアプリケーションを手動で含めることを好みます。これを行う方法に関する提案はありますか? – Pietro

関連する問題