带有 multiupload 的 django 形式的多个图像 [英] Multiple images in django form with multiupload

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

问题描述

我需要将 django 形式的多个图像添加到一个模型中.我做了一项研究,对于 django 之外的形式,我尝试设置 django-multiupload.>

我的models.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):第一个 = MultiImageField(min_num=1, max_num=20)第二 = MultiImageField(min_num=1, max_num=4)

在views.py中:

class UploadView(FormView):template_name = 'finder/submit.html'form_class = 添加表单成功网址 = '/'def form_valid(self, form):对于 form.cleaned_data['first'] 中的每个:Profile.objects.create(first=each)对于 form.cleaned_data['second'] 中的每个:Profile.objects.create(second=each)return super(UploadView, self).form_valid(form)

在提交表单时,此表单会创建多个 Profile 对象,其中仅填充了第一个/第二个字段.

如何只创建一个包含剩余字段(第一个/第二个字段除外)和多个第一个/第二个字段的模型?

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

def add_form(request, *args, **kwargs):如果 request.method == "POST":form = AddForm(request.POST)如果 form.is_valid():profile = form.save(commit=False)profile.save()返回重定向('/',pk=profile.pk)别的:表单 = 添加表单()返回渲染(请求,'finder/submit.html',{'form':form})

解决方案

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

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

简单的例子,

class Image(models.Model):图像 = 模型.FileField()profile = models.ForeignKey(Profile, related_name='images')is_first = models.BooleanField(默认=假)is_second = models.BooleanField(默认=假)

然后,编辑表单中的保存方法,

class AddForm(forms.ModelForm):第一个 = MultiImageField(min_num=1, max_num=20)第二 = MultiImageField(min_num=1, max_num=4)元类:模型 = 简介字段 = (.......... '第一', '第二')def save(self, commit=True):first_images = self.cleaned_data.pop('first')second_images = self.cleaned_data.pop('second')instance = super(AddForm, self).save()对于 first_images 中的每个:第一个 = 图像(图像=每个,配置文件=实例,is_first=True)首先.save()对于 second_images 中的每个:秒 = 图像(图像=每个,配置文件=实例,is_second=True)第二个.save()返回实例

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

class UploadView(FormView):template_name = 'finder/submit.html'form_class = 添加表单成功网址 = '/'def form_valid(self, form):实例 = form.save(commit=False)instance.user = self.request.user实例.save()return super(UploadView, self).form_valid(form)

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

def add_form(request, *args, **kwargs):如果 request.method == "POST":form = AddForm(request.POST)如果 form.is_valid():profile = form.save(commit=False)profile.user = request.userprofile.save()返回重定向('/',pk=profile.pk)别的:表单 = 添加表单()返回渲染(请求,'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})

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

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