Reputation: 1945
I have a inline formset set I can upload multiple instances of a model at once. How do you add a file? I keep getting that this error message 'The 'document' attribute has no file associated with it.'
Error happens here: if formset.is_valid():
Models class A(models.Modle): total ...
class B(models.Model):
invoice_id = models.ForeignKey(A)
misc_amt... = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
document = models.FileField(upload_to='images/', blank=True)
if I add this property, I get a different error: datastructures.MultiValueDictKeyError: "'b-0-id'"
@property
def document_url(self):
if self.document and hasattr(self.document, 'url'):
return self.document.url
formset
BFormSet = inlineformset_factory(A, B,
extra=0,
widgets={
'misc_amt':forms.TextInput(attrs={'size': '6',}),
'document':forms.FileInput(attrs={'multiple': False}),
}
)
HTML
<form method="post" enctype="multipart/form-data">{% csrf_token %}
{{ b_form.management_form }}
<table class="table" >
<tr class="text-center">
<td><strong>Misc.</strong></td>
<td><strong>Document</strong></td>
</tr>
{% for form in getperinfo_form.forms %}
<tr class="text-center">
<td>${{ form.misc_amt }}</td>
<td>{{ form.document }}</td>
</tr>
{% endfor %}
</table>
</form>
views.py
class AUpdateView(LoginRequiredMixin, UpdateView):
model = B
form_class = BForm
template_name = 'A.html'
def post(self,request,*args,**kwargs):
self.object =None
form_class = self.get_form_class()
form = self.get_form(form_class)
qs = A.objects.filter(
...
)
formset = BFormSet(self.request.POST,instance=qs.first())
if formset.is_valid():
return self.form_valid(formset)
else:
return self.form_invalid(form,formset)
def form_valid(self,formset):
formset = formset.save(commit=False)
for i in formset:
i.save()
return HttpResponseRedirect(self.get_success_url())
Upvotes: 0
Views: 150
Reputation: 1412
Add request.FILES
too to the formset
formset = BFormSet(request.POST,request.FILES, instance=qs.first())
Upvotes: 1