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

しかし、私の知る限り、同様の方法を使用してブール値を返し、それをカスタムフィルターとして渡すことはできません。

これも見ました: 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 に答える