Django的多个文件场(Django Multiple File Field)

2019-06-26 08:47发布

有没有可以处理多个文件或多个图像Django的模型场? 或者是更好地使一个ManyToManyField包含图像或文件一个单独的模型?

我需要完成在Django管理员上传界面的解决方案。

Answer 1:

对于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)


Answer 2:

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

典型的多重图像的关系被构建为与FK指向单独的图像模型到其相关的模型,例如ProductImage -> Product

这样的设置使得它很容易地添加到admin作为Inline

如果你是一个真正的多对多的关系,其中说的M2M领域将使意义GalleryImages从1个或多个引用的Gallery对象。



Answer 3:

我必须从具有现有系统和一些调查后,单个文件多个文件改变最终使用这样的: https://github.com/bartTC/django-attachments

它应该很容易,如果你想自定义方法的子类的模型。



Answer 4:

FilerFileField和FilerImageField在一个模型:

他们是django.db.models.ForeignKey的子类,所以适用同样的规则。 唯一的区别是,没有必要宣布什么模式,我们引用(它总是filer.models.File的FilerFileField和filer.models.Image为FilerImageField)。

简单例子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的文件管理器的文件



文章来源: Django Multiple File Field