Django多文件字段

时间:2012-07-17 19:10:03

标签: django file-upload django-models

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

我需要一个完整的django-admin上传界面解决方案。

4 个答案:

答案 0 :(得分:12)

对于2017年及以后的人,有一个special section in Django docs。我的个人解决方案就是这个(在管理员中成功运行):

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)

答案 1 :(得分:4)

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

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

此设置可让您以Inline的形式轻松添加到django管理员。

如果你真的是一个多对多的关系,那么M2M字段会有意义,其中GalleryImages来自一个或多个Gallery个对象。

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

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 document