【问题标题】:filter by ForeignKey in django admin在 django admin 中按 ForeignKey 过滤
【发布时间】:2012-06-29 23:32:25
【问题描述】:

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

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

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

【问题讨论】:

标签: python django filter web admin


【解决方案1】:

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

我会让你编写你的查询集过滤器(如果你遇到困难,请发表评论,我会填写)。

【讨论】:

  • 这只是 django 1.4,对吧?该项目仍在 1.3 上,所以我会稍等一下。但是如果没有其他解决方案,我会尝试升级。谢谢!
  • 这是一个很好的态度:) +1
猜你喜欢
  • 1970-01-01
  • 2011-03-09
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2010-10-27
  • 2018-03-23
  • 2014-01-30
相关资源
最近更新 更多