在django admin中通过ForeignKey过滤

时间:2012-06-28 12:35:19

标签: python django filter web admin

我有以下情况。有一个项目模型和一个项目图像模型。

class Project(models.Model):
   name = models.CharField(max_length=300)
   ... #some more fields

class ProjectImage(models.Model):
   image = models.ImageField(upload_to = "uploads/")
   projekt = models.ForeignKey(Projekt)

现在,我想成为一个管理面板用户来过滤掉管理区域中没有任何图像的所有项目。

我已经设法在概览中有一个绿色或红色的图标,无论是否附加了图像。它适用于模型管理员的自定义功能(这可能不是最快的解决方案,但工作正常)。

class ProjectAdmin(admin.ModelAdmin):
    def image(self, obj):
        img = "no"
        images = ProjectImage.objects.only('id',).filter(project=obj)
        if images:
            img = "yes"
        return "<img src='"+ADMIN_MEDIA_PREFIX+"img/admin/icon-"+img+".gif' />"

    list_display = ('name', 'bild')

但是AFAIK我不能使用类似的方法只返回一个布尔值并将其作为自定义过滤器传递。

我也看到了这一点:http://twigstechtips.blogspot.ch/2010/10/django-create-custom-admin-model-filter.html但看起来自定义过滤器必须附加到模型字段,而项目中没有图像字段。

我还有其他办法吗? THX

1 个答案:

答案 0 :(得分:2)

从Django 1.4开始,您应该可以使用custom list filters执行此操作。你想要这样的东西(未经测试):

from django.contrib.admin import SimpleListFilter

class HasImageFiter(SimpleListFilter):
    title = 'has image'
    parameter_name = 'has_image'

    def lookups(self, request, model_admin):
        return (
            ('Yes', 'Yes'),
            ('No', 'No'),
        )

    def queryset(self, request, queryset):
        if self.value() == 'Yes':
            return queryset.filter(...)
        if self.value() == 'No':
            return queryset.filter(...)

class ProjectAdmin(admin.ModelAdmin):
    list_filter = (HasImageFilter,)

我会让你编写你的查询集过滤(如果你遇到困难我会填写)。