2016-09-18 72 views
0

我需要更改django中的默认文件上传行为,而django网站上的文档相当混乱。如何覆盖django admin的默认文件上传行为?

我有一个域的模型如下:

class document (models.Model): 
    name = models.CharField(max_length=200) 
    file = models.FileField(null=True, upload_to='uploads/') 

我需要创建一个以.json文件,该文件将包含元数据,当一个文件被上传。例如,如果我上传文件mydocument.docx我需要在uploads /文件夹中创建mydocument.json文件,并添加有关文档的元信息。

从我可以从文档解密我需要创建一个文件上传处理程序作为django.core.files.uploadhandler.FileUploadHandler的子类。它也继续说我可以在任何我想要的地方定义这个。

我的问题:定义我的子类的最佳位置在哪里?从这里也发现了文档https://docs.djangoproject.com/en/1.8/ref/files/uploads/#writing-custom-upload-handlers看起来像子类看起来像下面这样:

class FileUploadHandler(object): 
    def handle_raw_input(self, input_data, META, content_length, boundary, encoding=None): 
     # do the acctual writing to disk   
    def file_complete(self, file_size): 
     # some logic to create json file 

是否有人在上传处理程序类,Django的1.8版工作的工作的例子吗?

+0

你是否需要docx和元数据json文件?在这种情况下,重写Doument.save方法并将JSON写入文件字段或将数据存储在TextField中可能会更容易。 – allcaps

+0

我第二@allcaps。如果你可以继续使用Django 1.9并使用Postgres,那么请利用JSONField,否则以模型中的其他结构化方式存储元数据。假设您可以在默认情况下上传新文件时覆盖以前上传的元数据 - 如果您不是,则上传文件是一种有效的方式,因为Django不会自动清除旧上传的文件(或生成的文件你放在那里)。 –

回答

1

一个选项可能是在用于最初上载文件的(模型)表单上生成.json文件。覆盖ModelFormsave()方法以在模型保存后立即生成文件。

class DocumentForm(forms.ModelForm): 
    class Meta(object): 
     model = Document 
     fields = 'name', 'file' 

    def save(self, commit=True): 
     saved_document = super().save(commit) 
     with open(saved_document.file.path + '.json', mode='w') as fh: 
      fh.write(json.dumps({ 
       "size": saved_document.file.size, 
       "uploaded": timezone.now().isoformat() 
      })) 
     return saved_document 

我这个地方进行测试,但情况因人而异,如果你正在使用自定义的储存与喜欢的东西S3工作。