Django:如何使用FilePathField获取文件大小

时间:2016-07-29 04:04:13

标签: python django

我在后期制作公司工作,我们在服务器上有我们的媒体文件。通过在第二台服务器上运行的站点,用户将指向一个文件,执行一些操作(例如计算校验和)并将结果保存在数据库中。

我正在寻找关于如何使用FilePathField获取文件大小的“最佳实践”示例。我已经阅读过教程并在文档中进行了搜索,但是我无法根据自己的需要将各个部分放在一起。

一些相关代码(编辑:更正了视图,打印了#1和#3):

models.py

    class AssetTest(models.Model):
        file_path = models.FilePathField(path=r"", default="")
        file_name = models.CharField(max_length=250, default="")
        file_size = models.IntegerField(default=0)

        def __str__(self):
            return self.file_path

forms.py

class AssetTestForm(forms.ModelForm):

    class Meta:
        model = AssetTest
        fields = ("file_name", "file_size")

views.py

def asset_select(request):
    if request.method == 'POST':
        print("1")
        form = AssetTestForm(request.POST)

        if form.is_valid():
            print("2")
            form.save(commit=False)
            form.file_name = request.FILES['file'].name
            form.file_size = request.FILES['file'].size
            form.save()
            return HttpResponseRedirect('/assetmanage/assets/')

        print("3")

    else:
        print("4")
        form = AssetTestForm()
return render(request, 'assetmanage/asset_select.html', {'form': form})

asset_select.html

{% extends "assetmanage/base.html" %}
{% block title %}Add Asset{% endblock %}

{% block body %}
<div class="container-fluid">

    <div class="row">

        <div class="col-sm-12 col-md-7">
            <div class="panel panel-default">
                <div class="panel-body">

                    <form class="form-horizontal" name="asset_select" action="/assetmanage/asset/test/" method="post" enctype="multipart/form-data">
                        {% csrf_token %}

                        <div class="form-group">
                            <label class="control-label col-sm-2">Select a file:</label>
                            <input type="file" name="asset_file">
                        </div>

                        <div class="form-group">
                            <div class="col-sm-offset-2 col-sm-10">
                                <button type="submit" class="btn btn-success">Submit</button>
                            </div>
                        </div>

                    </form>

                </div>
            </div>
        </div>
    </div>
</div>
{% endblock %}

1 个答案:

答案 0 :(得分:1)

在FilePathField中输入正确的路径名

FilePathField(path="/home/simon/",..)
cleaned_data的{​​p> FilePathField将为您提供确切的路径,以便使用它来获取文件名和文件大小......

form = AssetTestForm(request.POST)
if form.is_valid():
    form.save(commit=False)
    temp_file_obj = TemporaryFileUploadHandler(form.cleaned_data['file_path'])
    form.instance.file_size = temp_file_obj.chunk_size
    form.instance.file_name = form.cleaned_data['file_path'].split("/")[-1]
    form.save()