ModelForm上载多个图像:不将图像保存在静态文件夹中

时间:2019-09-12 18:13:24

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

  

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

     

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

models.py

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

forms.py

class UploadImages(forms.ModelForm):     类Meta:         型号=图片         栏位=('图片',)         widgets = {'picture':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 %}
  

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

2 个答案:

答案 0 :(得分:0)

您可能需要使用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)

答案 1 :(得分:0)

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

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')
  

希望这对社区有所帮助!