2016-07-29 1015 views
1

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

我正在寻找关于如何使用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") 

观点.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

在你FilePathField给出正确的路径名

FilePathField(path="/home/simon/",..) 

FilePathFieldcleaned_data会给你确切的路径,以便使用来获取文件名和它的文件大小。 ..

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

谢谢你,我已经用你的输入更新了我的代码,见上面;当我点击提交时,#1和#3被打印出来,所以表单似乎没有被验证。 –

+0

@SimonTheChain可以在无效时打印'form.errors'吗? –

+0

  • file_size
    • 此字段是必填项。
  • file_name
    • 此字段是必填项。

相关问题