我们正在使用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以将其保存到数据库。定制模型领域?