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

How to pass options to CloudinaryField in Django Model?

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

在我的用户模型中:

picture = CloudinaryField('image')

这与 Django Admin 和表单的预期一样有效。我只是希望能够将它存储在文件夹 users/USERNAME/profile 中,并且当有人更新他们的照片以删除旧照片时。

您还可以将这些选项添加到表单字段中,如下所示:

image = CloudinaryFileField(
    label='My image',
    options={
        'tags': "module, home",
        'format': 'jpg',
        'crop': 'limit',
        'width': 640
    },
    required=False)

更新

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

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

文档中列出了允许的参数 here and here in the code for version 1.17.0 or here

例如,我被关键词quality搞糊涂了。我在使用API时直接使用它,但在CloudinaryField中是不允许的。

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

transformation={"quality": 80}.

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

Note that when using the SDK for a dynamically typed language, the transformation parameters can be specified directly without using this transformation parameter.


这非常有效:

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

我花了一段时间才意识到——根据我在 Whosebug 中看到的问题,其他人也不清楚——CloudinaryField 和 CloudinaryFileField 看起来相似但不同 classes。 CloudinaryField 是一个模型 class,而 CloudinaryFileField 是一个表单 class。指定文件路径或标签的选项是在 FORM 级别使用 CloudinaryFileField (See Image Upload API documentation)

from cloudinary.forms import CloudinaryFileField
# Note - cloudinary folders are specified at the FORM level and not in the MODEL
class EditPhotoForm(ModelForm):
class Meta:
    model = Photo
    fields = ('name', 'description', 'image', 'slug')
    image = CloudinaryFileField(options={'folder' : 'media/photos/', 'tags': 'landscapes'})