- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个同时具有管理员和子管理员的应用程序。子管理员是根据他们所属的组创建的。因此,子管理员只能看到与其组相关的数据。此功能运行完美。
现在,我想创建一个基于用户的过滤器选项。对于 super 管理员来说,它工作正常,但是当我从子管理员那里查看时,我可以在过滤器列表中看到完整的用户列表。如何根据子管理员用户限制此列表。
假设一共有20个用户,而子管理员的组里只有3个用户。因此,我在 ListView 中只能看到 3 个用户,但在过滤器选项中我可以看到全部 20 个用户。我可以将此过滤器限制为仅限这 3 个用户吗?
我的管理模型如下所示:
class VideoDetailsAdmin(admin.ModelAdmin):
list_display = ('video_id', 'user', 'status', 'description', 'video_name', 'upload_time', 'duration')
list_filter = ('user', )
def get_queryset(self, request):
# Get the groups of logged in user
query_set = Group.objects.filter(user = request.user)
group_list = []
for g in query_set:
group_list.append(g.name)
# Get the user ids of Users in those groups
id_list = []
for user in list(User.objects.filter(groups__name__in=group_list)):
id_list.append(user.id)
# Create unique users list
users = list(set(id_list))
# Override the get_queryset method for Admin
qs = super(VideoDetailsAdmin, self).get_queryset(request)
if not request.user.is_superuser:
return qs.filter(user__in = users)
else:
return qs
我在 Django 上看到的可用资源很少 documentation ,但我想知道解决这个问题的最佳方法是什么。有没有办法可以重用 get_queryset() 代码
Django 版本:2.1
编辑1:
进行了以下修改,但没有可见过滤器。
# Filter list
class UserFilterList(admin.SimpleListFilter):
# Human readable title, which is displayed on the right sidebar
title = ("User")
# Parameter for the filter that will be used in the URL query
parameter_name = "user"
def lookups(self, request, model_admin):
# To get user's groups
query_set = Group.objects.filter(user = request.user)
group_list = []
for g in query_set:
group_list.append(g.name)
# To get all users associated in those groups
id_list = []
for user in list(User.objects.filter(groups__name__in=group_list)):
id_list.append(user.id)
users = list(set(id_list))
qs = model_admin.get_queryset(request)
def queryset(self, request, queryset):
if not request.user.is_superuser:
return qs.filter(user__in = users)
else:
return qs
编辑2:
class UserFilterList(SimpleListFilter):
title = "user"
parameter_name = "user"
def lookups(self, request, model_admin):
visible_users = model_admin.get_visible_users(request)
print(visible_users[0])
return ((user, user) for user in visible_users)
def queryset(self, request, queryset):
return self.value()
最终工作解决方案(感谢@dirkgroten):
class UserFilterList(SimpleListFilter):
title = "user"
parameter_name = "user"
def lookups(self, request, model_admin):
if not request.user.is_superuser:
visible_users = model_admin.get_visible_users(request)
# Sub user - return same group users
return ((user.id, user) for user in visible_users)
else:
# Superuser - return all users
return ((user.id, user) for user in User.objects.filter())
def queryset(self, request, queryset):
return queryset.filter(user=self.value()) if self.value() else queryset
class VideoDetailsAdmin(admin.ModelAdmin):
list_display = ('video_id', 'user', 'status', 'description', 'video_name', 'upload_time', 'duration')
list_filter = (UserFilterList, )
def get_visible_users(self, request):
# Get the groups of logged in user
query_set = Group.objects.filter(user = request.user)
group_list = []
for g in query_set:
group_list.append(g.name)
return User.objects.filter(groups__name__in=group_list)
def get_queryset(self, request):
users = self.get_visible_users(request)
# Override the get_queryset method for Admin
qs = super(VideoDetailsAdmin, self).get_queryset(request)
if not request.user.is_superuser:
return qs.filter(user__in = users)
else:
return qs
最佳答案
不要更改您的VideoDetailsAdmin
,仅使用自定义列表过滤器:
class VideoDetailsAdmin(ModelAdmin):
list_filter = UserFilterList # that's the only line to change
def get_visible_users(self, request): # small refactor to re-use in filter
query_set = Group.objects.filter(user=request.user)
group_list = []
for g in query_set:
group_list.append(g.name)
# To get all users associated in those groups
return User.objects.filter(groups__name__in=group_list)
def get_queryset(self, request):
users = self.get_visible_users(request)
# Override the get_queryset method for Admin
qs = super(VideoDetailsAdmin, self).get_queryset(request)
if not request.user.is_superuser:
return qs.filter(user__in=users)
else:
return qs
class UserFilterList(SimpleListFilter):
def lookups(self, request, model_admin):
visible_users = model_admin.get_visible_users(request)
return ((user.pk, user.username) for user in visible_users)
def queryset(self, request, queryset):
return queryset.filter(user_id=self.value()) if self.value() else queryset
关于python - Django "list_filter"基于管理查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55574344/
您好,我有两个对象: class A(models.Model): ... class B(models.Model): a = models.ForeignKey(A) 在管理员中,
Django 不支持从 list_display 或 list_filter 获取外键值(例如 foo__bar)。我知道您可以创建一个模块方法作为 list_display 的解决方法,但是我将如何
DECOM_CHOICES = ( ('N', 'No'), ('Y', 'Yes'), ) class Host(models.Model): hostname = mode
我正尝试在 Django Admin 中过滤带注释的字段,但出现 FieldDoesNotExist 错误。 class Event(models.Model): name = models.
让我们看一下这个例子: class Author(models.Model): ... class Book(models.Model): author = models.For
我用额外的选项扩展了用户,比如部门。但是当我尝试在管理面板为 derpartment 添加过滤器时。它抛出这个错误: ERRORS: : (admin.E116) The value of 'list
鉴于以下模型 class AnotherModel(models.Model): n = models.IntegerField() class MyModel(models.Model):
我的模型的change_list View 如下所示: 右侧的list_filter变得太长并且无法使用。 有没有办法获得更有用的方式来过滤Django的change_list View ? 最佳答案
我正在开发一个同时具有管理员和子管理员的应用程序。子管理员是根据他们所属的组创建的。因此,子管理员只能看到与其组相关的数据。此功能运行完美。 现在,我想创建一个基于用户的过滤器选项。对于 super
我们有三个模型,艺术家: class Artist(models.Model): family_name = models.CharField(max_length=50) given
在我的 admin.py 中,我按“事件”和“国家/地区”进行过滤,这是使用我的 SomethingAdmin 类中的以下代码行完成的.... list_filter = ['active', 'c
在 models.py 中我有: class User(modals.Model): name = models.CharField(max_length=255) image = m
如何根据登录用户在右侧list_filter中显示不同的记录? eg 如果superuser登陆listfilter可以查看list_filter中branch的changelist_view中所有客
所以这是我的代码: class Destino(models.Model): paisid = models.IntegerField(blank = True,null = True)
很抱歉,如果这个问题之前已经回答过,但我做了很多谷歌搜索都没有成功。 我知道如何在管理 View 中创建自定义 list_filter(例如子类化 SimpleFilter)。 我真正想要的是一种(在
我有一个模型,其字段如图所示。我在 wagtail_hooks.py 中创建了以下 ModelAdmin。 class opportunitiesAdmin(ModelAdmin): mode
是否可以只为 super 用户显示 list_filter? 最佳答案 Override changelist view 存储原始列表过滤器的副本,以便您可以根据请求动态设置属性。检查用户是否为 su
我想覆盖默认的 django 管理过滤器模板以使用我自己的模板: https://github.com/feincms/feincms/blob/master/feincms/templates/ad
django admin 中外键过滤器的 List_filter 标签始终按 id 排序,当列表中有很多过滤器时,这可能会导致困惑。 一段时间以来,我一直在寻找简单的解决方案,如何按字母顺序或按日期对
我需要按字段进行一对多过滤,但我只想显示相关对象而不是全部。 这可能吗,还是我必须创建自定义过滤器? 最佳答案 我尽量让我的模板保持“愚蠢”,所以我肯定会在 View 中过滤我的数据。你可以尝试这样的
我是一名优秀的程序员,十分优秀!