🖼️ Use Media
Camomilla has full media management. Everything is stored in the Media model.
To attach medias to a custom model just assign a ForeignKey or a ManyToMany relation.
class MyModel(models.Model):
image = models.ForeignKey(
"camomilla.Media",
blank=True,
null=True,
on_delete=models.SET_NULL,
)
gallery = models.ManyToManyField("camomilla.Media", blank=True)
Every media can be associated to a MediaFolder. The MediaFolder is a tree structure of folders (like a fs).
The media takes care of optimizing images. The optimization consists in a resize to a max width-height and to a DPI scaling. You can disable optimization or change sizes and dpi from settings:
CAMOMILLA = {
"MEDIA": {
"OPTIMIZE": {"MAX_WIDTH": 1980, "MAX_HEIGHT": 1400, "DPI": 30, "ENABLE": True},
},
}
Camomilla creates also image thumbnails. You can change, thumbnails size from settings:
CAMOMILLA = {
"MEDIA": {
"THUMBNAIL": {"FOLDER": "", "WIDTH": 50, "HEIGHT": 50}
},
}
🗂️ Media API
The media model has its own api methods to upload file.
Beware!
Remember to add camomilla api url to your urlpatterns. You can find more info here.
Upload new media
URL: /api/camomilla/media METHOD: POST MODE: MultipartFormData
PAYLOAD:
alt_text: Text
title: Text
description: Text
file: Multipart File
folder: Folder id
Update existing media
URL: /api/camomilla/media/<media_id> METHOD: PUT | PATCH MODE: MultipartFormData
PAYLOAD:
alt_text: Text
title: Text
description: Text
file: Multipart File
folder: Folder id
Get media detail
URL: /api/camomilla/media/<media_id> METHOD: GET
Response:
{
"id": 6,
"links": [],
"is_image": true,
"alt_text": null,
"title": null,
"description": null,
"file": "http://mydomain.it/media/sample-image.jpg",
"thumbnail": "http://mydomain.it/media/thumbnails/sample-image_thumb.jpg",
"created": "2023-07-24T13:47:26.986873Z",
"size": 680313,
"mime_type": "image/jpeg",
"image_props": {
"mode": "RGB",
"width": 1980,
"format": "JPEG",
"height": 1319
},
"folder": null
}
Navigate media folders
To navigate media you need to navigate folder structure. In the main url you will get all media and all folders without a parent folder (root elements).
URL: /api/camomilla/media-folder METHOD: GET
Response:
{
"folders": [
{
"id": 1,
"title": "Folder 1",
"slug": "folder-1",
"creation_date": "2023-07-31T15:17:37.612115Z",
"last_modified": "2023-07-31T15:17:37.612173Z",
"path": "/folder-1",
"updir": null
}
],
"media": {
"items": [
{
"id": 6,
"is_image": true,
"alt_text": null,
"title": null,
"description": null,
"file": "http://mydomain.com/media/sample-image.jpg",
"thumbnail": "http://mydomain.com/media/thumbnails/sample-image_thumb.jpg",
"created": "2023-07-24T13:47:26.986873Z",
"size": 680313,
"mime_type": "image/jpeg",
"image_props": {
"mode": "RGB",
"width": 1980,
"format": "JPEG",
"height": 1319
},
"folder": null,
}
],
"paginator": {
"count": 1,
"page": 1,
"has_next": false,
"has_previous": false,
"pages": 1,
"page_size": 18
}
},
"parent_folder": {
"title": "",
"path": "",
"updir": null
}
}
To navigate a subfolder just add its id to the url path:
URL: /api/camomilla/media-folder/<folder_id> METHOD: GET
The media endpoint response is always paginated. The pagination is made only for media elements. For subfolder you will get always all subfolder in a folder.