Programming

Django Admin에서 동일한 모델에 대한 여러 ModelAdmins / views

procodes 2020. 6. 18. 22:04
반응형

Django Admin에서 동일한 모델에 대한 여러 ModelAdmins / views


동일한 모델에 대해 둘 이상의 ModelAdmin을 작성하여 각각 다르게 다르게 사용자 정의하고 다른 URL에 링크하려면 어떻게해야합니까?

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

list_display와 같은 변수를 설정하거나 querysetModelAdmin 메소드를 재정 의하여 페이지에 표시되는 객체 목록을 다양한 방법으로 사용자 정의 할 수 있다는 것을 알고 있습니다 .

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_viewurls.py에 어떻게 든 포함될 수있는 기능을 보았지만 정확히 어떻게 작동하는지 잘 모르겠습니다.

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


프록시 모델을 사용하여 각 모델이 한 번만 등록 될 수 있다는 사실을 극복함으로써 원하는 것을 달성하는 한 가지 방법을 찾았습니다.

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

class MyPost(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액세스 /admin/myapp/post할 수 있고 사용자가 소유 한 게시물 목록은에 있습니다 /admin/myapp/myposts.

http://code.djangoproject.com/wiki/DynamicModels 를 본 후 동일한 기능을 수행하기 위해 다음 함수 유틸리티 함수를 찾았 습니다.

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)

Paul Stone answer is absolutely great! Just to add, for Django 1.4.5 I needed to inherit my custom class from admin.ModelAdmin

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

참고URL : https://stackoverflow.com/questions/2223375/multiple-modeladmins-views-for-same-model-in-django-admin

반응형