2010-02-08 4 views
115

동일한 모델에 대해 하나 이상의 ModelAdmin을 만들 수 있습니까? 각 모델은 다르게 사용자 정의되고 다른 URL에 연결되어 있습니까?Django에서 동일한 모델에 대한 여러 개의 ModelAdmins/views

Posts라고하는 장고 모델이 있다고 가정 해 보겠습니다. 기본적으로이 모델의 관리자보기에는 모든 Post 객체가 나열됩니다.

은 내가 list_display 같은 변수를 설정하거나과 같이 내 ModelAdmin에 queryset 방법을 대체하여 다양한 방법으로 페이지에 표시된 개체의 목록을 사용자 정의 할 수 있습니다 알고 : 기본적으로

class MyPostAdmin(admin.ModelAdmin): 
    list_display = ('title', 'pub_date') 

    def queryset(self, request): 
     request_user = request.user 
     return Post.objects.filter(author=request_user) 

admin.site.register(MyPostAdmin, Post) 

,이 액세스 할 것 URL은 /admin/myapp/post입니다. 그러나 동일한 모델의 ModelAdmins 여러보기를 갖고 싶습니다. 예 : /admin/myapp/post은 모든 게시 개체를 나열하고 /admin/myapp/myposts은 해당 사용자의 모든 게시물을 나열하고 /admin/myapp/draftpost은 아직 게시되지 않은 모든 게시물을 나열 할 수 있습니다. (이것들은 단지 예일뿐입니다. 실제 사용 사례는 더 복잡합니다.)

동일한 모델에 둘 이상의 ModelAdmin을 등록 할 수 없습니다 (이 경우는 AlreadyRegistered 예외가됩니다). 이상적으로는없이 모든 모델을 단일 ModelAdmin 클래스에 넣고 URL에 따라 다른 쿼리 세트를 반환하는 자체 'urls'함수를 작성하지 않고이 을 얻고 싶습니다.

Django 소스를 살펴 봤는데 ModelAdmin.changelist_view과 같은 기능이 내 urls.py에 포함되어있을 수 있지만 정확히 어떻게 작동하는지 확신 할 수 없습니다.

업데이트 : 내가 원하는 것을 수행하는 한 가지 방법을 찾았지만 (아래 참조) 여전히 다른 방법을 듣고 싶습니다.

답변

214

나는 각 모델에 한 번만 등록 할 수 있다는 사실 해결하기 위해 프록시 모델을 사용하여, 원하는 것을 달성하기 위해 한 가지 방법을 발견했습니다.

class PostAdmin(admin.ModelAdmin): 
    list_display = ('title', 'pubdate','user') 

class MyPosts(Post): 
    class Meta: 
     proxy = True 

class MyPostAdmin(PostAdmin): 
    def get_queryset(self, request): 
     return self.model.objects.filter(user = request.user) 


admin.site.register(Post, PostAdmin) 
admin.site.register(MyPost, MyPostAdmin) 

그런 다음 기본 PostAdmin은/관리/MyApp를/포스트 및 관리/MyApp를/myposts /에있을 것이다 사용자가 소유 게시물 목록에 액세스 할 수있다. 다음과 같이

def create_modeladmin(modeladmin, model, name = None): 
    class Meta: 
     proxy = True 
     app_label = model._meta.app_label 

    attrs = {'__module__': '', 'Meta': Meta} 

    newmodel = type(name, (model,), attrs) 

    admin.site.register(newmodel, modeladmin) 
    return modeladmin 

이 사용할 수 있습니다 :

class MyPostAdmin(PostAdmin): 
    def get_queryset(self, request): 
     return self.model.objects.filter(user = request.user) 

create_modeladmin(MyPostAdmin, name='my-posts', model=Post) 
+7

이것은 굉장합니다. 나는 프록시 사이트가 관리 사이트에 등록 될 수 있다는 것을 몰랐다. 이것은 실제로 나를 크게 도울 것입니다. –

+7

django에서 두 번 같은 모델을 등록 할 필요가있었습니다. 관리자 및 프록시 모델이 작동하는 것 같습니다. 하지만 권한 시스템에 문제가 하나 발견되었습니다. 참조 : http://code.djangoproject.com/ticket/11154 – bjunix

+4

ModelAdmin 쿼리 세트 대신 기본 관리자를 변경하는 것도 좋은 생각입니다. 따라서 프록시 모델의 동작은 관리자 외부에서도 일관됩니다. – bjunix

1

그냥 list_filter 또는 date_hierarchy를 사용하십시오.

date_hierarchy = 'pub_date' 

list_filter = ['pub_date',] 
+0

에서 내 사용자 정의 클래스를 상속하는 데 필요한 장고 1.4.5에 대한 추가 "즉, 변경 목록 페이지의 상단에 날짜별로 계층 적 탐색을 추가합니다. 최상위 레벨에서이를 사용할 수있는 모든 표시 며칠 동안 그리고 궁극적으로 며칠을 훈련합니다. " django docs에서 –

+0

날짜 별 필터링은 필자의 질문에서 언급 한 것입니다. 사실 더 복잡한 쿼리를 수행해야합니다. –

+1

괜찮습니까? 그렇다면 검색어는 무엇입니까? –

3

폴 스톤 대답을

http://code.djangoproject.com/wiki/DynamicModels보고 후, 나는 같은 일을 할 수있는 다음과 같은 기능 유틸리티 기능으로 왔어요 절대적으로 위대하다! 그냥 내가 admin.ModelAdmin

class MyPostAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     return self.model.objects.filter(id=1) 
관련 문제