Multiple ModelAdmins/views for same model in Django admin
I've found one way to achieve what I want, by using proxy models to get around the fact that each model may be registered only once.
class PostAdmin(admin.ModelAdmin): list_display = ('title', 'pubdate','user')class MyPost(Post): class Meta: proxy = Trueclass 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)
Then the default PostAdmin
would be accessible at /admin/myapp/post
and the list of posts owned by the user would be at /admin/myapp/myposts
.
After looking at http://code.djangoproject.com/wiki/DynamicModels, I've come up with the following function utility function to do the same thing:
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
This can be used as follows:
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)