是否有可以处理django的多个文件或多个图像的模型字段?或者将ManyToManyField设置为包含图像或文件的单独模型更好吗?
我需要一个完整的django-admin上传界面解决方案。
答案 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