繁体   English   中英

如何在 django 中上传文件

[英]How to upload file in django

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

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>

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

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

  1. 主要问题是您如何尝试更新file_document输入的name ,它不能以这种方式工作。 通过在 devtools 中检查来确认这一点。 在此处查看我的答案以更新 django 输入表单字段的名称属性 如果不更新此内容,您将无法从表单中获取文件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM