0

My code is:

models.py

class Claimmessage(models.Model):
    text = models.TextField(_('Сообщение'),)


class Claimfile(models.Model):
    claimmessage = models.ForeignKey(Claimmessage, on_delete=models.CASCADE, verbose_name=_('Сообщение рекламации'), )
    attachment = models.FileField(upload_to='claims/%Y/%m/%d/', blank=True, null=True,)

forms.py

class ClaimCreateForm( forms.Form ):
    message = forms.CharField(widget=forms.Textarea,)
    attachments = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

    def save(self, commit=False):
        message = self.cleaned_data.get("message")
        attachments = self.cleaned_data.get("attachments")

        mess = Claimmessage()
        mess.text = message
        mess.save()

        for f in attachments:
            Claimfile.objects.create(claimmessage=message, attachment=f)

views.py

if request.method == 'POST':
        form = ClaimCreateForm(request.POST, request.FILES,)
        if form.is_valid():
            obj = form.save()

            return redirect('claim_details', claim_id=obj.pk)
    else:
        form = ClaimCreateForm()

And I've got

AttributeError at /ru/claims/400002013/create/ 'bytes' object has no attribute '_committed'

How can I save file object in form.save() method?

Davit Tovmasyan
  • 3,238
  • 2
  • 20
  • 36

1 Answers1

0

Replace this block of code

for f in attachments:
    Claimfile.objects.create(claimmessage=message, attachment=f)

with the following

for f in attachments:
    claimfile = Claimfile(claimmessage=mess)
    claimfile.attachment.save(f.name, f, save=True)

See the explaination here

Davit Tovmasyan
  • 3,238
  • 2
  • 20
  • 36
  • **Some update**: `attachments = self.cleaned_data.get("attachments")` do not return iteratable object. You have to override widget class, or simply use this solution instead all of this: (https://github.com/Chive/django-multiupload) – Ilya Ibulaev Jul 30 '19 at 07:28