【问题标题】:ModelForm Upload Multiple Images: not saving images in static folderModelForm上传多个图像:不在静态文件夹中保存图像
【发布时间】:2020-01-14 16:01:18
【问题描述】:

我一直在尝试为图像编写多重上传代码,仅我的代码 即使选择了超过 1 张图片,我也会上传 1 张图片,我不知道如何迭代,一旦选择了文件并打印了我选择的多张图片,我就进行了打印,但是当我保存表单时,它只保存一张图片。

我基本上尝试使用出现在 Django 中的代码 文档。

models.py

class Images(models.Model):
    picture = models.ImageField(upload_to='media/photoadmin/pictures')

forms.py

类 UploadImages(forms.ModelForm): 元类: 模型 = 图片 字段 = ('图片',) 小部件 = {'图片': forms.ClearableFileInput( attrs={'multiple': True})}

views.py

 class Upload(FormView):
    form_class = UploadImages
    template_name = 'photoadmin/upload.html'
    success_url = 'photoadmin/'

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('picture')

        if form.is_valid():
            form.save()
            for f in files:
                file_instance = Images(picture=f)
                file_instance.save()

                return render(request, 'photoadmin/index.html')
        else:
            return render(request, 'photoadmin/index.html')

html

{% extends 'base.html' %}

{% block content %}
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}

    <button type="submit">Upload</button>
</form>

<p><a href="{% url 'index' %}">Return to home</a></p>
{% endblock %}

此代码写入数据库但不将文件上传到静态 文件夹

【问题讨论】:

  • 我认为不应该是form.save()。您想保存每个文件。
  • 您好,我搜索了另一种保存方式,但除了 form.save() 之外找不到任何不同的方式,您能建议我另一种方式吗?谢谢您的帮助
  • 请检查我的回答。我不确定它是否会起作用,因为我从未处理过基于类的表单。

标签: django django-models django-forms django-views


【解决方案1】:

您可能需要单独保存每个文件,使用 FileSystemStorage

from django.core.files.storage import FileSystemStorage
...

class Upload(FormView):
    form_class = UploadImages
    template_name = 'photoadmin/upload.html'
    success_url = 'photoadmin/'

    def post(self, request, *args, **kwargs):
            form_class = self.get_form_class()
            form = self.get_form(form_class)
            files = request.FILES.getlist('picture')
            if form.is_valid():
                fs = FileSystemStorage()
                for file in files:
                    fs.save(file.name, file)
                return render(request, 'photoadmin/index.html')
            else:
                return self.form_invalid(form)

【讨论】:

  • 您好,我收到以下错误:异常值:未定义名称“文件”。我试图定义它,但我对这一切都很陌生,它没有用。
  • 嗨,所以我尝试了很多方法,我仍然可以实现图像的多重上传,我回来并摆脱了由于我的代码错误而捕获的异常值,我没有不再出现错误,但它没有使用您提供的解决方案上传任何文件,我正在尝试的示例在 Django 文档docs.djangoproject.com/en/2.2/topics/http/file-uploads
【解决方案2】:

所以,这终于是解决方案了。

views.py

class UploadView(generic.CreateView):
form_class = UploadImages
model = PostSession
template_name = 'photoadmin/upload.html'
success_url = reverse_lazy('upload')

def form_valid(self, form):
    object = form.save(commit=False)
    form.save()
    if self.request.FILES:
        for afile in self.request.FILES.getlist('picture'):
            img = object.images.create(picture=afile)

    return super(UploadView, self).form_valid(form)

这样你就可以迭代

models.py

class PostSession(models.Model):
session_name = models.CharField(max_length=25)

def __str__(self):
    return str(self.session_name)


class Images(models.Model):
    name = models.ForeignKey(
        PostSession, related_name='images', on_delete=models.CASCADE, null=True, blank=True)
    picture = models.ImageField(upload_to='pictures')

希望这对社区有所帮助!

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多