子类化Django的ImageFileField

1 投票
2 回答
1356 浏览
提问于 2025-04-16 05:46

我想要对Django中的ImageFileField进行子类化,这样我就能访问图片的IPTC元数据,类似于下面这样:

>>> from myapp.models import SomeModel
>>> obj = SomeModel.objects.all()[0] # or what have you
>>> obj.image.iptc['keywords']
('keyword','anotherkeyword','etc')

... 文档中提到要查看Django的内部代码,我也看了;我尝试过制作一个可以工作的实现,但我不太确定自己在做什么——我之前定义过自定义字段,但对于基于文件的字段,我找不到合适的基础设置。

我知道我需要定义一个attr_class和一个descriptor_class来让它工作。有没有人能给我一个简单的例子或者建议,让我可以开始呢?

2 个回答

1

更新:我已经搞定这个问题了,部分要感谢@valya提供的回答。你可以在我修改的django-imagekit中找到一个成功的实现示例:

https://github.com/fish2000/django-imagekit/blob/icc-develop/imagekit/modelfields.py

6

你的问题不太清楚:你有没有尝试过类似这样的做法呢?

class ImageMetadataMixin(object):
    """Mixin can be added to any image file"""
    @property
    def iptc(self):
        """Or something like this"""

class ImageWithMetadataFieldFile(ImageMetadataMixin, ImageFieldFile):
    pass

class ImageWithMetadataField(ImageField):
    attr_class = ImageWithMetadataFieldFile

我觉得这已经足够了。你为什么觉得需要重新定义 descriptor_class 呢?

撰写回答