Django Admin에서 동일한 모델에 대한 여러 ModelAdmins / views
동일한 모델에 대해 둘 이상의 ModelAdmin을 작성하여 각각 다르게 다르게 사용자 정의하고 다른 URL에 링크하려면 어떻게해야합니까?
Posts라는 Django 모델이 있다고 가정 해 봅시다. 기본적으로이 모델의 관리자보기에는 모든 Post 객체가 나열됩니다.
list_display와 같은 변수를 설정하거나 queryset
ModelAdmin 의 메소드를 재정 의하여 페이지에 표시되는 객체 목록을 다양한 방법으로 사용자 정의 할 수 있다는 것을 알고 있습니다 .
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에 어떻게 든 포함될 수있는 기능을 보았지만 정확히 어떻게 작동하는지 잘 모르겠습니다.
업데이트 : 원하는 것을 수행하는 한 가지 방법을 찾았지만 (아래 참조) 여전히 다른 방법을 듣고 싶습니다.
프록시 모델을 사용하여 각 모델이 한 번만 등록 될 수 있다는 사실을 극복함으로써 원하는 것을 달성하는 한 가지 방법을 찾았습니다.
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)
'Programming' 카테고리의 다른 글
중첩 된 JSON 객체를 평면화 / 비편 성화하는 가장 빠른 방법 (0) | 2020.06.18 |
---|---|
Emacs에서 여러 쉘을 실행하는 방법 (0) | 2020.06.18 |
MySQL과 SQL Server의 차이점 (0) | 2020.06.18 |
전체 파일 경로에서 파일 이름 찾기 (0) | 2020.06.18 |
Java 프로그래머가 변수 이름을 "clazz"로 지정하는 이유는 무엇입니까? (0) | 2020.06.18 |