gpt4 book ai didi

django - 具有多重上传的 django 形式的多个图像

转载 作者:行者123 更新时间:2023-12-05 04:10:44 25 4
gpt4 key购买 nike

我需要将多个 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 对象,其中仅填充了第一个/第二个字段。

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

这是我在添加 multiupload 之前基于函数的 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.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)

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

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

然后,在 View 上,编辑 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)

或者在基于函数的 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 - 具有多重上传的 django 形式的多个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44075143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com