是否有可以为 django 处理多个文件或多个图像的模型字段?还是将 ManyToManyField 制作为包含图像或文件的单独模型更好?
我需要一个在 django-admin 中带有上传界面的解决方案。
是否有可以为 django 处理多个文件或多个图像的模型字段?还是将 ManyToManyField 制作为包含图像或文件的单独模型更好?
我需要一个在 django-admin 中带有上传界面的解决方案。
对于 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)
不,没有一个字段知道如何存储 Django 附带的多个图像。上传的文件在模型中存储为文件路径字符串,因此本质上是一个CharField
知道如何转换为python的文件。
典型的多图像关系构建为一个单独的 Image 模型,其中 FK 指向其相关模型,例如ProductImage -> Product
.
这种设置使得添加到 django admin 中变得非常容易Inline
。
如果您确实是从 1 个或多个对象GalleryImages
引用的多对多关系,则 M2M 字段将是有意义的。Gallery
我不得不从现有系统中的单个文件更改为多个文件,经过一番研究后最终使用了这个:https ://github.com/bartTC/django-attachments
如果您想要自定义方法,应该很容易对模型进行子类化。
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 文档