【问题标题】:How to get multiple files from a django FileField after model form object has been saved保存模型表单对象后如何从 django FileField 获取多个文件
【发布时间】:2019-12-24 09:07:05
【问题描述】:

我有一个带有附加字段的 django ModelForm 来上传一些文件。但是,我需要保存的模型才能对文件执行任何操作,而且我不确定在哪里或如何执行此操作。

我正在关注docs here

我要么需要在 FormView 中获取保存的模型,要么需要在 Form 中处理它:

class MessageForm(forms.ModelForm):
    class Meta:
        model = Message

    file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        files = self.cleaned_data.get('files')
        # do stuff with files here...
        # BUT I only get ONE file here, regardless of how many are uploaded with the form.

有没有办法让我获取Form的save方法中的所有文件?

或者,我可以通过视图获取所有文件,但是如何获取我需要的已保存模型?此表单正在创建一个新对象,我需要该对象才能对文件进行处理:

class FileFieldView(FormView):
    form_class = MessageForm
    template_name = 'upload.html'  # Replace with your template.
    success_url = '...'  # Replace with your URL or reverse().

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('file_field')
        if form.is_valid():
            for f in files:
                ...  # Do something with each file.
                 # BUT how do I get the saved object? I don't think it has been saved at this point anyway?
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

【问题讨论】:

    标签: django django-forms django-class-based-views


    【解决方案1】:
    if form.is_valid():
            obj = form.save()
            for f in files:
                ...  # Do something with each file.
                 # BUT how do I get the saved object? I don't think it has been saved at this point anyway?
    

    【讨论】:

    • 你能澄清一下吗?
    • 您现在拥有obj,这是一个Message,您可以使用您的文件
    • 谢谢,我发布了一个新问题,因为虽然这应该有效,但它对我不起作用,因为...stackoverflow.com/questions/57559590/…
    • 其实这行不通,因为它保存了两次对象。在这里,我再次假设 FormView 通常在其正常流程中保存对象的位置?
    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 2012-08-22
    • 2012-12-26
    • 1970-01-01
    • 2011-11-22
    • 2016-12-20
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多