如何在Django模型中将选项传递给CloudinaryField?

Ale*_*ter 4 django django-models cloudinary

我目前将Cloudinary与Django一起使用来存储用户个人资料图片,并希望将参数传递给它,将其存储在一个文件夹中并覆盖现有图像,而不是创建一个新图像。

在我的用户模型中:

picture = CloudinaryField('image')
Run Code Online (Sandbox Code Playgroud)

这可以按预期与Django Admin和表格一起使用。我只希望能够将其存储在用户/ USERNAME /个人资料文件夹中,并在有人更新其照片以删除旧照片时将其存储。

rar*_*iru 5

更新

在2016年有效的解决方案不再可行。根据docs,以下将起作用:

image = CloudinaryField(
    "Image",
    overwrite=True,
    resource_type="image",
    transformation={"quality": "auto:eco"},
    format="jpg",
)
Run Code Online (Sandbox Code Playgroud)

允许的PARAMS列在这里,并在这里为版本的代码1.17.0在这里的文档。

例如,我对关键字感到困惑quality。使用API​​时我曾直接使用它,但CloudinaryField不允许使用。

定义上传照片质量的正确方法是设置:

transformation={"quality": 80}

文档中对此进行了澄清,其中解释为:

请注意,将SDK用于动态类型语言时,可以直接指定转换参数,而无需使用此转换参数。


这完美地工作:

from cloudinary.models import CloudinaryField as BaseCloudinaryField
from django.db import models


class CloudinaryField(BaseCloudinaryField):
    def upload_options(self, model_instance):
        return {
            'public_id': model_instance.name,
            'unique_filename': False,
            'overwrite': True,
            'resource_type': 'image',
            'tags': ['map', 'market-map'],
            'invalidate': True,
            'quality': 'auto:eco',
        }

class MarketMap(models.Model):
    name = models.CharField(max_length=17)
    image = CloudinaryField()
Run Code Online (Sandbox Code Playgroud)