错误包括 Django admin 中的自定义模型方法

Errors including the custom model method in Django admin

我尝试做的事情

我尝试制作自定义管理方法以在我的管理面板中包含产品缩略图预览。 product_thumbnailProduct 模型中的 ImageField,它包含我在管理面板上上传的每个产品的一般信息。

我想 product_thumbnail 因为 不需要 。因此,我在 models.py 中也设置了 null=Trueblank=True

class Product(TimeStampModel):

    ...
    product_thumbnail = models.ImageField(verbose_name='상품사진', null=True, blank=True, upload_to='product_thumbnail')

我创建了如下自定义函数,并将其包含在 ProductAdmin 模型内的 list_display 管理选项中。

def thumbnail_preview(self, obj):
        return mark_safe(f'<img src="{obj.product_thumbnail.url}" width="40%" />')
thumbnail_preview.short_description = '상품사진'

我遇到了哪个错误?

我收到如下错误:

ValueError: The 'product_thumbnail' attribute has no file associated with it.

我尝试解决的问题

这可能是因为某些 Product 可能没有 product_thumbnail,因此 Django 管理员无法加载其 url,因为它的值为 null。

  1. 我使用了 try-except,这样如果 Django 找不到与该产品关联的 product_thumbnail,它就会抛出错误文本。
def thumbnail_preview(self, obj):
        try: 
            return mark_safe(f'<img src="{obj.product_thumbnail.url}" width="40%" />')
        except obj.product_thumbnail is None:
            return HttpResponse('No images')
thumbnail_preview.short_description = '상품사진'

然后我得到另一个错误如下:

TypeError: catching classes that do not inherit from BaseException is not allowed

我已经应用了迁移。我该如何解决这个问题?

你写except obj.product_thumbnail is None:,但是这是非常不正确的!在 except 关键字之后你应该指定一个 异常 class,而不是写一些条件。更好的是为什么还要在这里使用异常?一般来说,如果可以这样做,应该避免异常,考虑到如果 FileField / ImageField 没有文件,那么它们被认为是假的,您可以编写以下代码来解决您的问题:

def thumbnail_preview(self, obj):
    if obj.product_thumbnail:
        return  mark_safe(f'<img src="{obj.product_thumbnail.url}" width="40%" />')
    return HttpResponse('No images')
thumbnail_preview.short_description = '상품사진'

这意味着该文件根本没有上传到字段中,但您正在尝试获取它的 URL 这当然是不可能的,只需包装在条件中。查看使用模板修复的另一种方法:

https://fixexception.com/django/the-s-attribute-has-no-file-associated-with-it/