2010-01-09 17 views
9

Estoy buscando un administrador de archivos django robusto y estable para usar en el administrador de django.¿Puedes recomendar un buen administrador de archivos django para el administrador?

Mi lista de deseos requisitos:

  1. permite la navegación y la selección de los archivos en el servidor (por ejemplo, imágenes)
  2. Permite subir archivos. La carga de varios archivos sería excelente (con, por ejemplo, uploadify)
  3. No es necesario que use un campo personalizado en las definiciones de mi modelo (como django-filebrowser). Quiero algo que idealmente se pueda adjuntar a un CharField (o ImageField de FileField) en admin.py, como Carl Meyer's django-adminfiles.

He usado django-filebrowser (versión no Grappelli) y, también vieron (pero no se utiliza) django-adminfiles. Ambos son muy amables. Pero django-filebrowser requiere el uso de un campo personalizado en mis modelos, además de que no quiero la funcionalidad 'versiones' (múltiples tamaños de imagen). django-adminfiles es para insertar archivos como inlines en textareas, entonces no es lo que estoy buscando.

Estoy feliz de modificar uno de estos para satisfacer mis necesidades, pero odiaría hacerlo si hay otras alternativas que me faltan.

+0

https://github.com/sehmaschine/django-filebrowser ya no parece requerir campos personalizados en los modelos. –

Respuesta

2

FWIW, django-adminfiles también ha ocultado alguna incipiente funcionalidad para usar el buscador de archivos como un reemplazo de selección desplegable: entonces su modelo tendría una ForeignKey para el modelo "FileUpload", y usted podría navegar para llenar esa ForeignKey. ¿Está más cerca de lo que estás buscando?

No he necesitado ni usado esa característica en bastante tiempo, no está documentada ni probada, y ha habido mucha reescritura desde que la agregué, por lo que puede que esté o no en condiciones de funcionamiento. Pero está en mi lista de cosas para volver a ponerlo en condiciones de trabajo en estos días, y ciertamente no me opondría a una pequeña ayuda motivada ;-)

+1

Eso está más cerca de lo que estoy buscando, pero no del todo.Con el interés de eliminar las dependencias de otras aplicaciones, me gustaría que mi Modelo pueda funcionar con un CharField/FileField/ImageField. Entonces el administrador de archivos simplemente actualizaría el CharField con la ruta relativa basada en la selección del usuario. Parece que django-adminfiles está haciendo algo similar para la inserción "en línea" en las áreas de texto. Si no aparece ninguna otra respuesta aquí, probablemente intente cambiar tus archivos django-admin. (Bonita aplicación por cierto. ¡Gracias!) – zlovelady

+0

Si hay un widget para eso, podría ser posible modificar el widget y usarlo como un widget en un 'FilePathField', que creo que es como un' CharField' que limita las opciones a un archivo en una ruta particular. – LeafStorm

+0

@zlovelady: esa es una muy buena idea para el uso desacoplado; No sería reacio a incluir una característica de este tipo en django-adminfiles. –

1

Desde que publiqué la pregunta, encontré que django-filebrowser tiene una FileBrowseWidget. Con unos pocos hacks feos aplicados, pude hacerlo funcionar en el administrador de django en ImageField y FileField (no se necesitan más filebrowser.fields.FileBrowseField en el modelo).

Estoy usando esto como tal (con el non-grappelli-dependent django-filebrowser de wardi en github), y parece estar funcionando.

# a few changes to filebrowser/fields.py 

class FileBrowseWidget(Input): 
    ... 

    # change the default value of attrs from None to {} 
    def __init__(self, attrs={}): 
     ... # the rest unchanged 

    # change the default value of attrs, and the first few lines of render, like so 
    def render(self, name, value, attrs={}): 
     if value is None: 
      value = "" 
     else: 
      # set an attribute on value that the filebrowser templates need in 
      # order to display the thumbnail photo in the admin 
      for suffix in ['gif', 'GIF', 'jpg', 'JPG', 'png', 'PNG']: 
       if hasattr(value, 'path') and value.path.endswith("." + suffix): 
        value.filetype = "Image" 
        break 
     ... # the rest unchanged 


# admin.py 

from filebrowser.fields import FileBrowseWidget 

class FileBrowseForm(forms.ModelForm): 
    # Use a CharField, not an ImageField or FileField, since filebrowser 
    # is handling any file uploading 
    image = forms.CharField(required=True, widget=FileBrowseWidget()) 

class SomeModelAdmin(admin.ModelAdmin): 
    # SomeModel has an ImageField named image 
    form = FileBrowseForm 

    ... # the rest of the admin definition 

Esto es un poco feo, pero parece estar funcionando por ahora. Elimina la dependencia de nivel de modelo en django-filebrowser y empuja la dependencia al administrador, que es donde yo quería.

2

Como una adición a la respuesta de @zlovelady, también quería desacoplar django-filebrowser de las definiciones de mi modelo.

Tal vez su código ha cambiado desde entonces, pero la receta ya no funcionaba. Terminé con este para que funcione (por subclasificar FileBrowserWidget):

from filebrowser.base import FileObject 
from filebrowser.fields import FileBrowseWidget as fb_FileBrowseWidget 
from filebrowser.sites import site as filebrowser_site 

class FileBrowseWidget(fb_FileBrowseWidget): 
    def render(self, name, value, attrs=None): 
     if value is None: 
      value = "" 
     else: 
      value = FileObject(value.name, site=self.site) 
     return super(FileBrowseWidget, self).render(name, value, attrs) 

class FileBrowseForm(forms.ModelForm): 
    # Use a CharField, not an ImageField or FileField, since filebrowser 
    # is handling any file uploading 
    image = forms.CharField(
     required=True, 
     widget=FileBrowseWidget(attrs={'site':filebrowser_site}) 
    ) 

no estoy usando la versión sin Grappelli, pero no creo que importe, el código en cuestión tenía el mismo aspecto en ambas versiones.

+0

Esto me ayudó mucho. – sdornan

Cuestiones relacionadas