Estamos desarrollando una intranet con Django que debe tener una gestión de archivos coherente y centralizada. Implementamos una aplicación de administrador de archivos que debería manejar todas las cargas y descargas, hacer verificaciones de tipos MIME, verificaciones de permisos, etc.
La carga se logra a través de un formulario de 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
Ahora necesitamos realizar cargas en OTRA aplicación (por ejemplo, una aplicación de miembros con carga de imagen de perfil) utilizando el mismo formulario que el anterior. Sin embargo, debe incluirse en un formulario específico de la aplicación. Por ejemplo, un formulario con nombre, dirección, etc. Básicamente, solo necesitaríamos guardar la clave foránea correspondiente del archivo en el modelo de miembro y procesar la carga con el formulario del administrador de archivos.
Por eso pensamos en un archivo personalizado. Pero esto no está funcionando en absoluto...
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
Realmente no soy capaz de controlar esos campos de modelos personalizados... Necesitamos que funcione como un FileField (validación de widgets y demás) pero que se guarde como ForeignKey (en el Modelo de archivo físico real en otra aplicación)...
Si hay otra manera de lograr lo que estamos buscando, por favor dígame.
tldr; Cargue archivos en la aplicación A pero deje que la aplicación B los procese, guarde la ruta del archivo, los metadatos, etc. y devuelva la clave extranjera del objeto procesado a A para guardarlo en la base de datos. ¿Campo de modelo personalizado?