Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django自定义AdminModel视图_Python_Django_Django Admin - Fatal编程技术网

Python Django自定义AdminModel视图

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

在我的Django应用程序中,我拥有为所有未注册用户创建的
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)