359๐
โ
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 = 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)
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
3๐
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)
๐คzzart
- [Django]-How to show processing animation / spinner during ajax request?
- [Django]-Django storages aws s3 delete file from model record
- [Django]-Serializer call is showing an TypeError: Object of type 'ListSerializer' is not JSON serializable?
2๐
Based on the correct answers, I monkeypatch the AdminSite
class and add the method register_via_proxy
to make the task easier.
import re
from django.contrib import admin
def _register_proxy(self, model, admin_class):
proxy_model = type(
admin_class.__name__, (model,), {
"__module__": re.sub(
r'(^.*?)(\.[^\.]+)$', r'\1.proxy', model.__module__
),
"Meta": type("Meta", tuple(), {
"proxy": True,
"app_label": model._meta.app_label
})
}
)
return self.register(proxy_model, admin_class)
admin.sites.AdminSite.register_via_proxy = _register_proxy
And to use is like:
site = admin.sites.AdminSite()
site.register_via_proxy(models.ModelType, AdminClass)
๐คFelipe Buccioni
- [Django]-How can I get tox and poetry to work together to support testing multiple versions of a Python dependency?
- [Django]-How do you catch this exception?
- [Django]-In Django, how do I check if a user is in a certain group?
Source:stackexchange.com