Django UpdateView(CBV/FBV)多文件上传失败,提示必填字段错误
问题描述
尝试通过更新模板,使用UpdateView实现单文件和多文件上传,但提交时始终出现此字段为必填项错误,文件无法上传。所有必填字段均已填写有效数据类型,且文件上传字段为可选,无法定位错误来源。
已尝试基于函数的视图(FBV)和基于类的视图(CBV),问题依旧;甚至为多文件上传字段创建单独模型,以及继承updateCoopForm类的单独表单类,仍未解决问题。怀疑视图中的if form.is_valid():部分存在错误。
多文件上传字段模型
class shareCapitalFiles(models.Model): # Foreign key coopform = models.ForeignKey(CoopForm, on_delete=models.CASCADE) # Attach evidence of share capital attach_share_capital = models.FileField('Attach Share Capital', upload_to="documents", blank=True)
forms.py代码
# Update Form class updateCoopForm(forms.ModelForm): nature_registration = forms.ChoiceField(widget=forms.RadioSelect(attrs={'class': 'flex inline-flex', 'cursor': 'pointer'}), choices=CoopForm.REGISTRATION_TYPE) have_bye_laws = forms.ChoiceField(widget=forms.RadioSelect(attrs={'class': 'flex inline-flex', 'cursor': 'pointer'}), choices=CoopForm.BYE_LAWS_CHOICES) attach_bye_laws = forms.FileField(required=False) class Meta: model = CoopForm fields = '__all__' widgets = { 'first_purpose': forms.Textarea(attrs={'rows':2}), 'second_purpose': forms.Textarea(attrs={'rows':2}), 'third_purpose': forms.Textarea(attrs={'rows':2}), 'first_origin_meeting_date': forms.DateInput(attrs={'type': 'date'}), 'second_origin_meeting_date': forms.DateInput(attrs={'type': 'date'}) } class shareCapitalForm(updateCoopForm): attach_share_capital = forms.FileField(label='Attach Share Capital',widget=forms.ClearableFileInput(attrs={'multiple': True}), required=False) class Meta(updateCoopForm.Meta): fields = updateCoopForm.Meta.fields
CBV代码
class updateFormView(UpdateView): model = CoopForm form_class = shareCapitalForm context_object_name = 'obj' template_name = 'updateform.html' def get_queryset(self): return CoopForm.objects.all() def get_success_url(self): return reverse('formdetails', kwargs={'pk': self.object.id}) def get_context_data(self, **kwargs): context = super(updateFormView, self).get_context_data(**kwargs) if self.request.POST: context['form'] = shareCapitalForm(self.request.POST, self.request.FILES, nstance=self.object) else: context['form'] = shareCapitalForm(instance=self.object) return context def post(self, request, *args, **kwargs): self.object = self.get_object() form_class = self.get_form_class() form = self.get_form(form_class) files = self.request.FILES.getlist('attach_share_capital') if form.is_valid(): update = form.save(commit=False) if files: for f in files: instance = shareCapitalFiles.objects.create(coopform=update, attach_share_capital=f) instance.save() messages.success(request, 'Files uploaded successfully') #update.author = self.request.user update.save() return self.form_valid(form) else: return self.form_invalid(form)
FBV代码
def updateformview(request, pk, *args, **kwargs): # fetch the object related to passed id obj = get_object_or_404(CoopForm, id=pk) # pass the object as instance in form form = shareCapitalForm(request.POST or None, request.FILES or None, instance=obj) # get the template template = loader.get_template('updateform.html') # if the form is being updated if request.method == 'POST': # retrieve multiples files from model field files = request.FILES.getlist('attach_share_capital') # save the data from the form and # redirect to detail_view if form.is_valid(): update = form.save(commit=False) update.save() if files: for f in files: instance = shareCapitalFiles.objects.create(coopform=update, attach_share_capital=f) instance.save() return HttpResponseRedirect(reverse('formdetails', kwargs={'pk': id})) context = { 'form': form, 'obj': obj } return HttpResponse(template.render(context, request))
多文件上传字段HTML代码
<div class="grid gap-6 mt-1 mx-auto md:grid-cols-2 lg:grid-cols-2 px-6 pt-4 pb-8 bg-stone-50 border border-1 border-gray-300 shadow-md"> <!-- Attach Share Capital --> <div> <label for="attach_share_capital" class="block mb-2 text-md font-bold text-gray-500"> {{ form.attach_share_capital.label }} </label> {% render_field form.attach_share_capital class+="cursor-pointer text-md md:text-md font-medium block rounded-sm w-full p-2 border border-2 border-gray-300 placeholder-gray-500 text-gray-600 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500" %} <p class="mt-1 text-sm text-gray-500">PDF, DOC (WORD), PNG OR JPG formats only. You can attach multiple files</p> </div> {% if form.errors.attach_share_capital %} <span class="text-red-600 font-medium">{{ form.errors.attach_share_capital }}</span> {% endif %} </div>
内容的提问来源于stack exchange,提问作者Uwa Isibor
相关产品推荐
相关产品推荐

