【问题标题】:Django 2 Saving models.FileField manualy in forms.pyDjango 2 在 forms.py 中手动保存 models.FileField
【发布时间】:2019-07-29 11:41:47
【问题描述】:

我的代码是:

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()

我有

/ru/claims/400002013/create/'bytes' 对象的 AttributeError 没有 属性“_committed”

如何在 form.save() 方法中保存文件对象?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    替换这段代码

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

    以下

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

    查看说明here

    【讨论】:

    • 一些更新attachments = self.cleaned_data.get("attachments") 不返回可迭代对象。您必须覆盖小部件类,或者简单地使用此解决方案来代替所有这些:(github.com/Chive/django-multiupload)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多