【问题标题】:How do I override django admin's default file upload behavior?如何覆盖 django admin 的默认文件上传行为?
【发布时间】:2017-01-26 04:26:37
【问题描述】:

我需要更改 django 中的默认文件上传行为,并且 django 站点上的文档相当混乱。

我有一个模型,其字段如下:

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 版的上传处理程序类的工作示例吗?

【问题讨论】:

  • 你需要 docx 和 metadata json 文件吗?在这种情况下,覆盖 Doument.save 方法并将 JSON 写入文件字段或将数据存储在 TextField 中可能会更容易。
  • 我第二个@allcaps。如果您可以继续使用 Django 1.9 并使用 Postgres,请利用 JSONField,否则以其他结构化方式将元数据存储在模型上。这是假设您可以在默认情况下上传新文件时覆盖先前上传的元数据 - 如果您不是,那么文件上传是一种有效的方式,因为 Django 不会自动清除旧上传的文件(或生成的文件你放在那里)。

标签: python 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 之类的东西,我已经在本地进行了测试,但 YMMV。

【讨论】:

    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 2012-01-02
    • 2019-07-23
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多