Aller au contenu

# Champs de modèle

## `ResizedImageFieldFile`

Bases: `ImageFieldFile`

### `get_resized_dimensions(image)`

Get the dimensions of the resized image.

If the width and height are given, they are used. If only one is given, the other is calculated to keep the same ratio.

Returns:

Type | Description
--- | ---
`tuple[int, int]` | Tuple of width and height

Source code in `core/fields.py`

    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    def get_resized_dimensions(self, image: Image.Image) -> tuple[int, int]:
        """Get the dimensions of the resized image.

        If the width and height are given, they are used.
        If only one is given, the other is calculated to keep the same ratio.

        Returns:
            Tuple of width and height
        """
        width = self.field.width
        height = self.field.height
        if width is not None and height is not None:
            return self.field.width, self.field.height
        if width is None:
            width = int(image.width * height / image.height)
        elif height is None:
            height = int(image.height * width / image.width)
        return width, height

### `get_name()`

Get the name of the resized image.

If the field has a force_format attribute, the extension of the file will be changed to match it. Otherwise, the name is left unchanged.

Raises:

Type | Description
--- | ---
`ValueError` | If the image format is unknown

Source code in `core/fields.py`

    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    def get_name(self) -> str:
        """Get the name of the resized image.

        If the field has a force_format attribute,
        the extension of the file will be changed to match it.
        Otherwise, the name is left unchanged.

        Raises:
            ValueError: If the image format is unknown
        """
        if not self.field.force_format:
            return self.name
        formats = {val: key for key, val in Image.registered_extensions().items()}
        new_format = self.field.force_format
        if new_format in formats:
            extension = formats[new_format]
        else:
            raise ValueError(f"Unknown format {new_format}")
        return str(Path(self.file.name).with_suffix(extension))

## `ResizedImageField(width=None, height=None, force_format=None, **kwargs)`

Bases: `ImageField`

A field that automatically resizes images to a given size.

This field is useful for profile pictures or product icons, for example.

The final size of the image is determined by the width and height parameters :

- If both are given, the image will be resized to fit in a rectangle of width x height
- If only one is given, the other will be calculated to keep the same ratio

If the force_format parameter is given, the image will be converted to this format.

Examples:

To resize an image with a height of 100px, without changing the ratio, and a format of WEBP :

    class Product(models.Model):
        icon = ResizedImageField(height=100, force_format="WEBP")

To explicitly resize an image to 100x100px (but possibly change the ratio) :

    class Product(models.Model):
        icon = ResizedImageField(width=100, height=100)

Raises:

Type | Description
--- | ---
`FieldError` | If neither width nor height is given

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`width` | `int | None` | If given, the width of the resized image | `None`
`height` | `int | None` | If given, the height of the resized image | `None`
`force_format` | `str | None` | If given, the image will be converted to this format | `None`

Source code in `core/fields.py`

    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    def __init__(
        self,
        width: int | None = None,
        height: int | None = None,
        force_format: str | None = None,
        **kwargs,
    ):
        if width is None and height is None:
            raise FieldError(
                f"{self.__class__.__name__} requires "
                "width, height or both, but got neither"
            )
        self.width = width
        self.height = height
        self.force_format = force_format
        super().__init__(**kwargs)