如何将选项传递给 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'})
我目前正在使用 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'})