23

是否有可以为 django 处理多个文件或多个图像的模型字段?还是将 ManyToManyField 制作为包含图像或文件的单独模型更好?

我需要一个在 django-admin 中带有上传界面的解决方案。

4

4 回答 4

14

对于 2017 年及以后的人,Django 文档中有一个特殊部分。我的个人解决方案是这样的(在管理员中成功运行):

class ProductImageForm(forms.ModelForm):
    # this will return only first saved image on save()
    image = forms.ImageField(widget=forms.FileInput(attrs={'multiple': True}), required=True)

    class Meta:
        model = ProductImage
        fields = ['image', 'position']

    def save(self, *args, **kwargs):
        # multiple file upload
        # NB: does not respect 'commit' kwarg
        file_list = natsorted(self.files.getlist('{}-image'.format(self.prefix)), key=lambda file: file.name)

        self.instance.image = file_list[0]
        for file in file_list[1:]:
            ProductImage.objects.create(
                product=self.cleaned_data['product'],
                image=file,
                position=self.cleaned_data['position'],
            )

        return super().save(*args, **kwargs)
于 2017-07-17T11:06:16.797 回答
7

不,没有一个字段知道如何存储 Django 附带的多个图像。上传的文件在模型中存储为文件路径字符串,因此本质上是一个CharField知道如何转换为python的文件。

典型的多图像关系构建为一个单独的 Image 模型,其中 FK 指向其相关模型,例如ProductImage -> Product.

这种设置使得添加到 django admin 中变得非常容易Inline

如果您确实是从 1 个或多个对象GalleryImages引用的多对多关系,则 M2M 字段将是有意义的。Gallery

于 2012-07-17T19:25:26.503 回答
5

我不得不从现有系统中的单个文件更改为多个文件,经过一番研究后最终使用了这个:https ://github.com/bartTC/django-attachments

如果您想要自定义方法,应该很容易对模型进行子类化。

于 2012-07-17T19:37:08.963 回答
2

FilerFileField 和 FilerImageField 在一个模型中:

它们是 django.db.models.ForeignKey 的子类,因此适用相同的规则。唯一的区别是,不需要声明我们引用的模型(对于 FilerFileField 始终是 filer.models.File,对于 FilerImageField 始终是 filer.models.Image)。

简单示例models.py:

from django.db import models
from filer.fields.image import FilerImageField
from filer.fields.file import FilerFileField

class Company(models.Model):
    name = models.CharField(max_length=255)
    logo = FilerImageField(null=True, blank=True)
    disclaimer = FilerFileField(null=True, blank=True)

models.py 中同一模型上的多个图像文件字段:

注意:related_name 属性是必需的,就像定义外键关系一样。

from django.db import models
from filer.fields.image import FilerImageField

class Book(models.Model):
    title = models.CharField(max_length=255)
    cover = FilerImageField(related_name="book_covers")
    back = FilerImageField(related_name="book_backs")

此答案代码取自django-filer 文档

于 2014-08-27T06:35:08.943 回答