Django模型字段从一个应用程序上传文件但保存另一个应用程序

时间:2017-05-02 10:20:17

标签: python django forms model upload

我们正在使用Django开发一个内部网,它必须具有一致且集中的文件管理。我们实现了一个文件管理器应用程序,它应该处理所有上传和下载,进行mimetype检查,权限检查等。

上传是通过Django表单实现的:

class UploadFileForm(forms.ModelForm):
class Meta:
    model = PhysicalFile
    fields = ('path', 'directory')

def save(self, commit=True):
    """
    Override save method of ModelForm to create Physical File object of
    uploaded file and to process meta data
    """
    # Proceed with default behaviour but DO NOT commit!
    # pfile contains the PhysicalFile object which is not yet written to DB
    pfile = super(UploadFileForm, self).save(commit=False)

    # set pfile's meta data according to:
    # https://docs.djangoproject.com/en/1.11/ref/files/uploads/
    pfile.name = self.cleaned_data['path'].name
    pfile.size = self.cleaned_data['path'].size
    pfile.mimetype = self.cleaned_data['path'].content_type

    # NOW save to database, ignoring commit parameter
    pfile.save()

    return pfile

现在我们需要使用与上面相同的表格在另一个应用程序(例如带有个人资料图片上传的会员应用程序)上执行上传。但是,它需要包含在特定于应用程序的表单中。例如。具有名称,地址等的表单。基本上我们只需要将文件的相应foreignKey保存到memberModel中,并使用filemanger的形式处理上传。

这就是为什么我们想到了一个自定义文件。但这根本没有用。

class FilemanagerUploadField(models.ForeignKey):
def __init__(self, upload_to=None, *args, **kwargs):
    # Will be used later to bind specific apps to specific directories
    self.upload_to = upload_to
    # Bind PhysicalFile as default Model
    super(FilemanagerUploadField, self).__init__('filemanager.PhysicalFile')

def formfield(self, **kwargs):
    """ Taken from django's FileField but does NOT WORK"""
    defaults = {'form_class': forms.FileField, 'max_length': self.max_length} 

    if 'initial' in kwargs:
        defaults['required'] = False
    defaults.update(kwargs)
    return super(FilemanagerUploadField, self).formfield(**defaults)

def save(self):
    # somewho run form from here with uploaded data and return foreignKey

我真的无法控制那些自定义模型字段......我们需要它像FileField(小部件验证和东西)一样执行,但是像ForeignKey一样保存(到另一个应用程序中的实际PhysicalFile模型) ...

如果有其他方法可以实现我们正在寻找的目标,请告诉我。

tldr;上传App A中的文件但让App B处理它,保存文件路径,元数据等,并将已处理对象的ForeignKey返回给A以将其保存到数据库。定制模型领域?

0 个答案:

没有答案