We are developing an intranet with Django which has to have a consistent and centralized file managmenet. We implemented a filemanager app which should handle all the uploads and downloads, do mimetype checks, permission checks etc.
The upload ist achieved through a Django form:
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
Now we need want to perform uploads in ANOTHER app (say a members app with profile picture upload) using the same form as above. However, it needs to be included into an app specific form. E.g. a form with name, address etc. Basically we would only need to save the corresponding foreignKey of the file into the memberModel and process the upload with the filemanger's form.
That is why we thought of a custom filed. But this is not working out at all..
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
I am not really able to get a grip on those custom model fields... We need it to perform like a FileField (widget validation and stuff) but be saved like a ForeignKey (to the actual PhysicalFile Model in another app)...
If there is another way to achieve what we are looking for, please tell me.
tldr; Upload files in App A but let App B process it, save the file path, meta data etc, and return ForeignKey of the processed object to A to save it to database. Custom model field?