django形式的多张图片具有multiupload [英] Multiple images in django form with multiupload

查看:462
本文介绍了django形式的多张图片具有multiupload的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将django形式的多个图像添加到一个模型.我进行了一项研究,并针对django以外的表格尝试设置 django-multiupload .

我的模型.py:

class Profile(models.Model):
    ...
    ...
    first = models.ImageField("first", upload_to='first')
    second = models.ImageField("second", upload_to='second')
    ...

在forms.py中:

class AddForm(forms.ModelForm):
    first = MultiImageField(min_num=1, max_num=20)
    second = MultiImageField(min_num=1, max_num=4)

在views.py中:

class UploadView(FormView):
    template_name = 'finder/submit.html'
    form_class = AddForm
    success_url = '/'

    def form_valid(self, form):
        for each in form.cleaned_data['first']:
            Profile.objects.create(first=each)
        for each in form.cleaned_data['second']:
            Profile.objects.create(second=each)
        return super(UploadView, self).form_valid(form)

在提交表单时,此表单将创建多个Profile对象,并且仅填充第一/第二字段.

如何仅创建一个具有剩余字段(第一/第二个字段除外)并且具有多个第一/第二字段的模型?

在添加多重上传之前,这是我基于函数的视图,但是我无法使其工作,也许以某种方式更改它更容易吗?

def add_form(request, *args, **kwargs):
    if request.method == "POST":
        form = AddForm(request.POST)
        if form.is_valid():
            profile = form.save(commit=False)
            profile.save()
            return redirect('/', pk=profile.pk)
    else:
        form = AddForm()
    return render(request, 'finder/submit.html', {'form': form})

解决方案

我从未使用过Django-multiupload,但是我碰巧阅读了一些文档.

如果要为用户模型保存多个文件,则可能需要创建另一个模型来容纳文件,并向Profile模型添加外键. 从个人档案"模型中删除第一个和第二个字段.它会导致您使用相同的数据创建多个配置文件,以容纳多个图像.

简单的例子,

class Image(models.Model):
    image = models.FileField()
    profile = models.ForeignKey(Profile, related_name='images')
    is_first = models.BooleanField(default=False)
    is_second = models.BooleanField(default=False)

然后,编辑表单中的save方法,

class AddForm(forms.ModelForm):
    first = MultiImageField(min_num=1, max_num=20)
    second = MultiImageField(min_num=1, max_num=4)

    class Meta:
        model = Profile
        fields = (.......... 'first', 'second')

    def save(self, commit=True):
        first_images = self.cleaned_data.pop('first')
        second_images = self.cleaned_data.pop('second')
        instance = super(AddForm, self).save()
        for each in first_images:
           first = Image(image=each, profile=instance, is_first=True)
           first.save()

        for each in second_images:
           second = Image(image=each, profile=instance, is_second=True)
           second.save()

        return instance

然后,在视图上,编辑视图,

class UploadView(FormView):
    template_name = 'finder/submit.html' 
    form_class = AddForm 
    success_url = '/' 

    def form_valid(self, form): 
        instance = form.save(commit=False)
        instance.user = self.request.user
        instance.save()

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

或者在基于函数的视图中,

def add_form(request, *args, **kwargs): 
    if request.method == "POST": 
        form = AddForm(request.POST)
        if form.is_valid(): 
            profile = form.save(commit=False) 
            profile.user = request.user
            profile.save() 
            return redirect('/', pk=profile.pk) 
    else: 
        form = AddForm() 
    return render(request, 'finder/submit.html', {'form': form})

I need to add multiple images in django form to one model. I did a research and for form outside of django I try to setup django-multiupload.

My models.py:

class Profile(models.Model):
    ...
    ...
    first = models.ImageField("first", upload_to='first')
    second = models.ImageField("second", upload_to='second')
    ...

In forms.py:

class AddForm(forms.ModelForm):
    first = MultiImageField(min_num=1, max_num=20)
    second = MultiImageField(min_num=1, max_num=4)

In views.py:

class UploadView(FormView):
    template_name = 'finder/submit.html'
    form_class = AddForm
    success_url = '/'

    def form_valid(self, form):
        for each in form.cleaned_data['first']:
            Profile.objects.create(first=each)
        for each in form.cleaned_data['second']:
            Profile.objects.create(second=each)
        return super(UploadView, self).form_valid(form)

And on submitting form this form creates multiple Profile objects with only first/second field filled.

How can I create only one model with remaining fields (other than first/second) and with multiple first/second fields?

It was my function-based view before adding multiupload but I couldn't make it work, maybe it's easier to change it somehow?

def add_form(request, *args, **kwargs):
    if request.method == "POST":
        form = AddForm(request.POST)
        if form.is_valid():
            profile = form.save(commit=False)
            profile.save()
            return redirect('/', pk=profile.pk)
    else:
        form = AddForm()
    return render(request, 'finder/submit.html', {'form': form})

解决方案

I have never used the Django-multiupload, but I happen to read some of the docs.

If you want to save multiple files for your user model, you may need to create another model for accommodating the files and add a Foreign Key towards the Profile model. Remove the first and second fields from Profile model. It causes you to create multiple profiles with same data inorder to accomodate multiple images.

Simple example,

class Image(models.Model):
    image = models.FileField()
    profile = models.ForeignKey(Profile, related_name='images')
    is_first = models.BooleanField(default=False)
    is_second = models.BooleanField(default=False)

Then, edit the save method in form,

class AddForm(forms.ModelForm):
    first = MultiImageField(min_num=1, max_num=20)
    second = MultiImageField(min_num=1, max_num=4)

    class Meta:
        model = Profile
        fields = (.......... 'first', 'second')

    def save(self, commit=True):
        first_images = self.cleaned_data.pop('first')
        second_images = self.cleaned_data.pop('second')
        instance = super(AddForm, self).save()
        for each in first_images:
           first = Image(image=each, profile=instance, is_first=True)
           first.save()

        for each in second_images:
           second = Image(image=each, profile=instance, is_second=True)
           second.save()

        return instance

Then, on the views, edit the view,

class UploadView(FormView):
    template_name = 'finder/submit.html' 
    form_class = AddForm 
    success_url = '/' 

    def form_valid(self, form): 
        instance = form.save(commit=False)
        instance.user = self.request.user
        instance.save()

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

Or in function based view,

def add_form(request, *args, **kwargs): 
    if request.method == "POST": 
        form = AddForm(request.POST)
        if form.is_valid(): 
            profile = form.save(commit=False) 
            profile.user = request.user
            profile.save() 
            return redirect('/', pk=profile.pk) 
    else: 
        form = AddForm() 
    return render(request, 'finder/submit.html', {'form': form})

这篇关于django形式的多张图片具有multiupload的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆