gpt4 book ai didi

python - Django 自定义管理模型 View

转载 作者:行者123 更新时间:2023-11-28 20:52:22 25 4
gpt4 key购买 nike

在我的 Django 应用程序中,我有为所有未注册用户创建的 Guest 用户帐户(他们都有 email='guest@mysite.com')。同时我创建了一些与 guest 帐户相关的演示对象。这些对象与注册用户的对象位于同一个表中(具有相同的模型)。而且我有不止一种类型(模型)的这些对象,例如:

class Object1(models.Model):
user = ForeignKey(...)
...

class Object2(models.Model):
user = ForeignKey(...)
...

我想要实现的是当我在 django admin 中查看与 guest 帐户相关的所有对象时,过滤掉

现在我将 django.contrib.admin.views.main.ChangeList 子类化并覆盖 get_query_set 方法来执行所需的排除,然后我重新定义 get_changelist django 的 ModelAdmin 类在运行时的方法:

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 类并覆盖其 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

关于python - Django 自定义管理模型 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6752388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com