0

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

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但看起来自定义过滤器必须附加到模型字段和我在项目中没有图像字段。

我还有其他方法可以做到这一点吗?谢谢

4

1 回答 1

2

从 Django 1.4开始,您应该可以使用自定义列表过滤器来做到这一点。你想要这样的东西(未经测试):

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,)

我会让你编写你的查询集过滤(如果你卡住了,请评论,我会填写)。

于 2012-06-28T12:42:04.273 回答