2016-10-17 15 views
4

私は自分のカスタムクラスでAdminSiteクラスをオーバーライドしようとしました。私はdjangoのドキュメンテーションからチュートリアルに従った:https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#customizing-adminsiteしかし、それは動作しませんでした。具体的には、元のAdminSiteを自分のクラスで上書きしたいのですが、自分のプロジェクトに別の管理サイトを追加するだけではありません。Django(1.10)がAdminSiteをオーバーライド

私が追加しました私のアプリのurls.pyに

from django.contrib.admin import AdminSite 


class MyAdminSite(AdminSite): 
    pass 

次にクラスから継承し、私のカスタムクラスMyAdminSiteを作成しました:

from django.conf.urls import url, include 
import django.contrib.admin as admin 
from .admin_site import MyAdminSite 

admin.site = MyAdminSite() 
admin.autodiscover() 


urlpatterns = [ 
    url(r'^', admin.site.urls), 
] 

動作するように見えますが、管理モデルMyAdminSiteのAdminSite instedへの登録です。

は、私は私のカスタムサイトへのレジスタモデルの三つの方法を試してみました:

@admin.register(Model) 
class ModelAdmin(model.AdminModel): 
... 

モデルが元AdminSiteに登録されているこの方法です。

第二の方法:仕事と例外が発生することはありません

@admin.site.register(Model): 
class ModelAdmin(model.AdminModel): 
... 

。 ModelAdminクラスは、メソッドの登録に渡されません。

最終方法:

class ModelAdmin(model.AdminModel): 
... 
admin.site.register(Model, ModelAdmin) 

動作しますが、adminサイト上で私は、Djangoの管理者(ユーザーとグループ)からの唯一の私のモデルではないモデルを見ることができます。

admin.siteを永久に上書きし、すべてのモデルをMyAdminSiteに登録するにはどうすればよいですか?

+0

どのようにあなたのカスタムの管理サイトにモデルを登録していますか? – knbk

+0

あなたがリンクしているドキュメントの中で、これがうまくいくと思いましたか? –

+0

docsのサイトは単なる例であり、私が望むもの以外のものがあることを知っています。私は他のチュートリアルや他の方法もたくさん試しましたが、どれもうまくいきません。 – ostojan

答えて

1

問題の解決策が見つかりませんでしたが、回避策を講じました。

まず我々は我々のアプリ(例えばadmin.py)でモジュールを作成し、クラスAdminSiteを拡張する必要があります。

我々はMyAdminSiteのインスタンスを作成して登録する必要がモジュールの下部に続いて
from django.contrib.admin import AdminSite 

class MyAdminSite(AdminSite): 
    ... 

ビルトインジャンゴからモデル:

site = MyAdminSite() 
site.register(Group, GroupAdmin) 
site.register(User, UserAdmin) 

必要な輸入:

from django.contrib.auth.models import Group, User 
from django.contrib.auth.admin import GroupAdmin, UserAdmin 

私たちのサイトで元のサイトオブジェクトを上書きする必要のあるURLモジュール:

from .admin import site 

admin.site = site 
admin.autodiscover() 
... 
url(r'^admin/', admin.site.urls) 
... 

私たちのモデルを登録する必要があります。私たちのMyAdminSiteオブジェクトに登録我々はModelAdminのクラスを定義してから呼び出す必要が

@admin.site.register(MyModel) 
class MyModelAdmin(admin.ModelAdmin): 
    ... 

@admin.register(MyModel) 
class MyModelAdmin(admin.ModelAdmin): 
    ... 

か:私たちは覚えする必要があることの一つは、我々はそのようなデコレータとして登録使用できないことです:

class MyModelAdmin(admin.ModelAdmin): 
    ... 
admin.site.register(MyModel, MyModelAdmin 

これは私のために働く唯一の解決策です。 myappに/ admin.pyから

3

from django.contrib.auth.models import Group, User 
from django.contrib.auth.admin import GroupAdmin, UserAdmin 
from django.contrib.admin import AdminSite 
from django.contrib import admin 

from .models import MyModel #This is my app's model 

# Custom admin site 
class MyAdminSite(AdminSite): 
    site_header = 'My Project Title' 
    site_title = 'My Project Title Administration' 
    index_title = 'My Project Title Administration' 
    # You can add on more attributes if you need 
    # Check out https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#adminsite-objects 

# Create admin_site object from MyAdminSite 
admin_site = MyAdminSite(name='my_project_admin') 

# Register the models 
class MyModelAdmin(admin.ModelAdmin): 
    list_display = ('id', 'description') 

admin_site.register(MyModel, MyModelAdmin) 

# Create and register all of your models 
# .... 

# This is the default Django Contrib Admin user/group object 
# Add this if you need to edit the users/groups in your custom admin 
admin_site.register(Group, GroupAdmin) 
admin_site.register(User, UserAdmin) 

でmyproject/urls.py

から
from django.conf.urls import url 
from django.contrib import admin 
from myapp.admin import admin_site ##! Important..Import your object (admin_site) instead of your class (MyAdminSite) 

urlpatterns = [ 
    url(r'^admin/', admin_site.urls), #Now all /admin/ will go to our custom admin 
] 
関連する問題