【发布时间】:2012-02-19 05:37:57
【问题描述】:
我目前有一个这样的模型:
我有一个 Test 类,其中包含一个自定义 UserProfile 类的外键。此属性称为student。因此,每个 UserProfile 可能占用了多个 Test。然后,每个UserProfile 又通过典型的onetoone 关系绑定到User。因为我已经声明了两个用户组tutors 和students,所以增加了另一个复杂程度。 UserProfile 类与其自身具有多对多关系,标记为“导师”。逻辑是每个学生可能有很多导师教他。现在我想做的是在测试管理页面的右侧添加过滤器,让您可以按学生过滤,也可以按导师过滤。设置list_filter = ('student',) 只是列出所有可用的用户配置文件。但这也包括与导师相关的 UserProfiles。显然,我想将这个列表过滤到只有学生,因为这些导师中的任何一个明确过滤都会导致一个空的查询集。然后我想通过导师过滤做类似的事情,在这种情况下,速记是list_filter = ('student__tutors'),但我希望这个 UserProfile 集被过滤掉,只包括那些 user_groups em>_name='导师'。最好的方法是什么?
为了清楚起见,我的对象模型如下所示:
class UserProfile(models.Model):
user = models.OneToOneField(User, unique=True,related_name='profile')
tutors = models.ManyToManyField("self",related_name="students")
class Test(models.Model):
student = models.ForeignKey(UserProfile,related_name='tests')
我尝试使用以下方法对django.contrib.admin.SimpleListFilter 进行子类化:
class StudentListFilter(SimpleListFilter):
title = 'student'
parameter_name = 'student__id__exact'
def lookups(self, request, model_admin):
qs = model_admin.queryset(request)
return User.objects.filter(profile__id__in=qs.values_list('student__id')).extra(select={'full_name':'first_name||" "||last_name'}).values_list('profile__id','full_name')
def queryset(self, request, queryset):
if self.value() is not None:
return queryset.filter(student__id__exact=self.value())
else:
return queryset
这似乎适用于第一个 list_filter,但问题是由于某种原因,现在存在一个错误,即所选选项没有在自定义过滤器中突出显示。只有“全部”突出显示,而不是自定义选项。这是另一个用户发布的示例:
我目前正在使用 django 1.4 的开发版本,所以我不确定这个问题是否与此有关。
【问题讨论】:
标签: django django-admin django-admin-filters