【问题标题】:How to upload file in django如何在django中上传文件
【发布时间】:2021-01-24 11:26:31
【问题描述】:

这可能是一个非常愚蠢的问题。我也是 django 的新手。但我试图用 django 创建一个基本的文件上传方法,用户上传一个文件并将其存储到定义的媒体路径(或任何它所称的)中,并且文件大小、名称和其他一些需要的属性可以存储到数据库中。所以我已经准备好了模型,它可以帮助你更好地理解这个问题。

class Document(models.Model):
    file_uid = models.CharField(max_length = 16)
    file_name = models.CharField(max_length = 255)
    file_size = models.CharField(max_length = 255)
    file_document = models.FileField(upload_to='uploaded_files/')
    uploaded_on = models.DateTimeField(auto_now_add=True)
    uploaded_by = models.CharField(max_length=16)

现在很明显,我们不需要在表单中创建所有字段,并且大多数字段都可以从文件本身接收(如名称、大小)。对于其他属性,如 uid 和由这些上传的也将由后端添加。所以这就是我卡住的地方。我已经连续搜索了 2 天,仍然找不到合适的解决方案。

到目前为止,这是我的views.py

def uploadView(request):
    if(request.method == 'POST'):
        form = FileUploadForm(request.POST, request.FILES)
        uploaded_file = request.FILES['uploaded_file']
        file_dict = {
            'file_uid' : get_random_string(length=10),
            'file_name' :uploaded_file.name,
            'file_size' : uploaded_file.size,
            'file_document' : request.FILES['uploaded_file'],
            'uploaded_by' : get_random_string(length=10)
        }
        form = FileUploadForm(data=file_dict)
        if form.is_valid():
            form.save()
            return HttpResponse("You reached here")
        else:
            return HttpResponse("Your form is invalid")

    else:
        form = FileUploadForm(request.POST, request.FILES)
        return render(request, 'function/upload.html', {
            'form':form
        })

我不知道这是否正确,但据我所知 form.isvalid() 是错误的。

这是我的 forms.py

class FileUploadForm(forms.ModelForm):
    file_document = forms.FileField(widget=forms.FileInput(attrs={'name':'uploaded_file'}))

    class Meta:
        model = Document
        fields = ('file_uid', 'file_name', 'file_size', 'file_document', 'uploaded_by')

我的上传页面部分看起来像这样

<body>
    <h1>Upload a file</h1>
    <form action="" method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="file" name="uploaded_file">
        <button type="submit">Upload</button>
    </form>
</body>

如果您能仁慈地指导我采取正确的做法,我将不胜感激。

【问题讨论】:

    标签: django django-models django-views django-forms


    【解决方案1】:

    在解决之前,我在您的代码中发现了一些问题

    1. 主要问题是您如何尝试更新file_document 输入的name,但这种方式不起作用。通过在 devtools 中检查来确认这一点。 在这里查看我对update name attribute of django input form field 的回答。 如果不更新此内容,您将无法从表单中获取文件。

    2. 不只是我想指出的问题

    def uploadView(request):
        if(request.method == 'POST'):
            form = FileUploadForm(request.POST, request.FILES)
            # your code in between, here the above form is never used and the overridden by the form in next line so why assigning it
            form = FileUploadForm(data=file_dict)
            # your form.is_valid() code start here
    
        else:
            form = FileUploadForm(request.POST, request.FILES)
            # This block will only run for GET request, why using request.POST, request.FILES
            return render(request, 'function/upload.html', {
                'form':form
            })
    

    我是这样让你的代码工作的

    像这样更新 FileUploadForm

    class FileUploadForm(forms.ModelForm):
        class Meta:
            model = Document
            fields = ('file_uid', 'file_name', 'file_size', 'file_document', 'uploaded_by')
    
        # below code is only used to change the name of file_document to uploaded_file
        custom_names = {'file_document': 'uploaded_file'}
        def add_prefix(self, field_name):
            field_name = self.custom_names.get(field_name, field_name)
            return super(FileUploadForm, self).add_prefix(field_name)
    

    像这样在html中使用表单

    <form method="POST" action="" enctype="multipart/form-data">
        {% csrf_token %}
        {{form.file_document}}
        <input type="submit" value="send"/>
    </form>
    

    将视图更新为

    def uploadView(request):
        if(request.method == 'POST'):
            uploaded_file = request.FILES['uploaded_file']
            file_dict = {
                'file_uid' : 'test1',
                'file_name' :uploaded_file.name,
                'file_size' : uploaded_file.size,
                'uploaded_by' : 'hemant'
            }
            form = FileUploadForm(file_dict, request.FILES)
            if form.is_valid():
                form.save()
                return HttpResponse("You reached here")
            else:
                return HttpResponse("Your form is invalid")
    
        else:
            form = FileUploadForm()
            return render(request, 'function/upload.html', {
                'form':form
            })
    

    【讨论】:

    • 感谢您的回答。我意识到我在代码中保留了一些错误,因为我急于发布问题。不过,我最终最终使用了另一种方法。我也会试试你的方法,让你知道。
    • 很高兴知道您成功了!如果您的方法与我的方法有很大不同,我建议您将其发布为这个问题的答案,这对于遇到同样问题的人偶然发现这篇文章非常有帮助。
    猜你喜欢
    • 2017-08-18
    • 2015-08-06
    • 2011-08-17
    • 2021-07-24
    • 2011-06-24
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多