Python Django自定义AdminModel视图
在我的Django应用程序中,我拥有为所有未注册用户创建的Python Django自定义AdminModel视图,python,django,django-admin,Python,Django,Django Admin,在我的Django应用程序中,我拥有为所有未注册用户创建的Guest用户帐户(他们都有电子邮件帐户)guest@mysite.com'). 同时,我创建了一些与来宾帐户相关的演示对象。 这些对象与注册用户的对象位于同一个表中(具有相同的模型)。我有不止一种类型(模型)的对象,比如: class Object1(models.Model): user = ForeignKey(...) ... class Object2(models.Model): user = For
Guest
用户帐户(他们都有电子邮件帐户)guest@mysite.com'). 同时,我创建了一些与来宾帐户相关的演示对象。
这些对象与注册用户的对象位于同一个表中(具有相同的模型)。我有不止一种类型(模型)的对象,比如:
class Object1(models.Model):
user = ForeignKey(...)
...
class Object2(models.Model):
user = ForeignKey(...)
...
我想实现的是,当我在django admin中查看客户帐户时,过滤掉所有与客户帐户相关的对象
现在,我将子类化django.contrib.admin.views.main.ChangeList
并重写get\u query\u set
方法来执行所需的排除,并且在运行时重新定义django的ModelAdmin类的get\u ChangeList
方法:
class FilteredChangeList(ChangeList):
def get_query_set(self):
qs = super(FilteredChangeList, self).get_query_set()
if is_related_to(self.model, Profile):
qs = qs.exclude(user__email='guest@mysite.com')
return qs
def my_getchangelist(self, request, **kwargs):
return FilteredChangeList
ModelAdmin.get_changelist = my_getchangelist
我认为在运行时重新定义django的方法是一种不好的做法,那么这个问题有没有正确的解决方案?您可以子类化
ModelAdmin
并重写get\u changelist
方法,而不是在运行时重新定义
class FilteredModelAdmin(ModelAdmin):
def get_changelist(self, request, **kwargs):
return FilteredChangeList
然后使用FilteredModelAdmin注册您的模型,而不是ModelAdmin
admin.site.register(Object1, FilteredModelAdmin)
admin.site.register(Object2, FilteredModelAdmin)
class Object1ModelAdmin(FilteredModelAdmin)
# other customizations here
admin.site.register(Object1, Object1ModelAdmin)
如果需要为模型子类FilteredModelAdmin
而不是ModelAdmin
自定义任何其他设置
admin.site.register(Object1, FilteredModelAdmin)
admin.site.register(Object2, FilteredModelAdmin)
class Object1ModelAdmin(FilteredModelAdmin)
# other customizations here
admin.site.register(Object1, Object1ModelAdmin)
我猜你做的工作比必要的多得多。您还可以创建自己的
ModelAdmin
类并覆盖其queryset
方法,无需构建自己的ChangeList
类:
class MyFilteredAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = super(MyFilteredAdmin, self).queryset(request)
if is_related_to(self.model, Profile):
qs = qs.exclude(user__email='guest@mysite.com')
return qs
然后,您可以直接向这个新的管理类注册您的模型-
admin.site.register(Model,MyFilteredAdmin)
,或者创建继承自MyFilteredAdmin
的子类,而不是从django的ModelAdmin
您也可以拥有代理模型。你可以有一个有“真实”用户,一个有“来宾”用户。是的,但是我应该为我拥有的每种类型的相关对象编写自定义模型管理员。我已经更新了答案。如果您不需要为模型自定义任何其他管理设置,请将其注册到FilteredModelAdmin
而不是ModelAdmin
。我认为lazerscience的答案更好——我认为您不需要为ChangeList
创建子类,只需覆盖ModelAdmin.queryset
。
admin.site.register(Object1, FilteredModelAdmin)
admin.site.register(Object2, FilteredModelAdmin)
class Object1ModelAdmin(FilteredModelAdmin)
# other customizations here
admin.site.register(Object1, Object1ModelAdmin)