📜  ImageField – Django 表单(1)

📅  最后修改于: 2023-12-03 15:01:22.983000             🧑  作者: Mango

ImageField – Django 表单

在 Django 中, ImageField 是一种可用于表单的字段类型,用于添加和保存图像文件。可以将它添加到 Django 模型表单中以允许上传和保存图像文件。

如何使用 ImageField?

使用 ImageField 很容易。以下是如何将它添加到 Django 模型表单中:

from django.db import models

class MyModel(models.Model):
    image = models.ImageField(upload_to='images/')

在这个例子中,upload_to 是可选参数,它决定了上传的图像存储在哪里。在这个例子中,图像将上传到名为 images/ 的子目录中。

表单中的 ImageField

要将 ImageField 添加到表单中,我们可以使用 django.forms.ImageField 类。以下是一个完整的例子:

from django import forms
from myapp.models import MyModel

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('image',)

    image = forms.ImageField()

注意,我们将 ImageField 添加到表单字段中,而不是 Django 数据库模型中。这是一种允许用户上传并保存图像文件的简单方法。

图像大小限制

如果需要限制上传图像的大小,可以使用 validators 参数。以下是一个例子:

from django.core.validators import FileExtensionValidator, FileSizeValidator

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('image',)

    image = forms.ImageField(validators=[FileSizeValidator(1024*1024*2), FileExtensionValidator(['png', 'jpg'])])

在这个例子中,我们使用了 validators 参数来限制上传的图像大小为 2MB,以及只允许上传扩展名为 'png' 和 'jpg' 的文件。

表单中的预览

为了在表单中预览上传的图像,我们可以使用以下代码:

from django.forms.widgets import ClearableFileInput

class ImageWidget(ClearableFileInput):
    template_with_initial = '<br/>'.join(('%(input)s', '%(image)s', '%(clear_template)s',))

    def render(self, name, value, attrs=None, renderer=None):
        template_with_initial = self.template_with_initial
        substitutions = {
            'input': super().render(name, value, attrs),
            'image': '<img src="%s" alt="%s" style="max-width: 800px; max-height: 800px;"/>' % (value.url, value),
            'clear_template': '',
        }
        if not self.is_required:
            clear_checkbox_name = self.clear_checkbox_name(name)
            substitutions['clear_template'] = ClearableFileInput.clear_checkbox_tag(clear_checkbox_name)

        return mark_safe(template_with_initial % substitutions)


class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('image',)

    image = forms.ImageField(widget=ImageWidget)

在这个例子中,我们定义了一个名为 ImageWidget 的定制化 widget,并将它用作表单的 ImageField 字段。这样就可以在表单中预览上传的图像。

以上是 ImageField - Django 表单 的介绍。通过使用 ImageField,你可以轻松地添加和保存图像文件并进行预览。