Django Admin 上的布尔过滤器

Boolean Filter on Django Admin

我正在尝试在我的 Django 管理员上构建一个对应于 has_images 方法的过滤器,但我做不到,因为它严格地说 has_images 不是模型的字段。我尝试将其设置为 属性,但它也不起作用。

我考虑过将 has_images 定义为一个字段并根据模型的变化真正计算它,但我认为这不是最佳选择。

什么是好的解决方案?

models.py

class Product(models.Model):

    name = models.CharField("Name", max_length=255)

    def has_images(self):
        return self.images.all().count() > 0
    has_images.boolean = True

class ProductImage(models.Model):

    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="images")
    file = models.ImageField("Product Image")

admin.py

class ProductImageInline(admin.TabularInline):
    model = ProductImage
    fields = ('file',)
    extra = 1

class ProductAdmin(VersionAdmin):
    list_display = ('id', 'name', 'has_images',)
    inlines = (ProductImageInline,)

预期结果:

你能分享 admin.py 文件的内容吗?

还是我解释如下。将名为 list_filter = ('images') 的功能添加到您在 admin.py 中创建的 ProductAdmin class 中。如果此功能不起作用(我不确定,因为我没有尝试过),如果您直接为 ProductImages 创建 Admin Class,您已经可以在该页面上查看图片和相应的产品。

------------编辑----------------

我就是这样解决问题的。

models.py

from django.db import models

class Product(models.Model):

    name = models.CharField("Name", max_length=255)
    is_image = models.BooleanField(default=False, editable=False)

    def save(self, *args, **kwargs):
        if self.images.count():
            self.is_image = True
        else:
            self.is_image = False
        super(Product, self).save(*args, **kwargs)

class ProductImage(models.Model):

    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="images")
    file = models.ImageField("Product Image")

    def save(self, *args, **kwargs):
        super(ProductImage, self).save(*args,**kwargs)
        self.product.save()

admin.py

from django.contrib import admin
from .models import *

class ProductImageInline(admin.TabularInline):
    model = ProductImage
    fields = ('file',)
    extra = 1

class ProductAdmin(admin.ModelAdmin):
    list_display = ('id', 'name',)
    list_filter = ('is_image',)
    inlines = (ProductImageInline,)

admin.site.register(Product, ProductAdmin)

这里我添加了一个默认为False的is_image BooleanField字段。每次 Product 模型的 save 方法运行时,它都会检查 ProductImage 中是否有 Product 模型附加到的图像。如果里面有图片,is_image设置为True。