2010-01-09 8 views
9

Ich bin auf der Suche nach einem robusten, stabilen Django-Dateimanager für den Einsatz im Django-Admin.Kannst du dem Admin einen guten Django-Dateimanager empfehlen?

Meine Anforderungen Liste wünschen:

  1. Ermöglicht Browsen und Auswahl von Dateien auf dem Server (zum Beispiel Bilder)
  2. Ermöglicht das Hochladen von Dateien. Der Upload mehrerer Dateien wäre großartig (z. B. mit uploadify)
  3. Erfordert es nicht, ein benutzerdefiniertes Feld in meinen Modelldefinitionen zu verwenden (wie django-filebrowser). Ich möchte etwas, das ideal an ein CharField (oder ImageField of FileField) in admin.py, wie Carl Meyer's django-adminfiles angeschlossen werden kann.

Ich habe django-filebrowser (non-Grappelli Version) verwendet und auch sah (aber nicht verwendet) django-adminfiles. Beide sind sehr nett. Aber django-filebrowser benötigt ein benutzerdefiniertes Feld in meinen Modellen, und ich möchte nicht die Funktionen "Versionen" (mehrere Bildgrößen). django-adminfiles ist zum Einfügen von Dateien als Inlines in Textareas, also nicht das, wonach ich suche.

Ich bin froh, eine von diesen zu ändern, um meine Bedürfnisse zu erfüllen, aber würde es hassen, dies zu tun, wenn es andere Alternativen gibt, die ich vermisse.

+0

https://github.com/sehmaschine/django-filebrowser scheint keine benutzerdefinierten Felder in den Modellen mehr zu erfordern. –

Antwort

2

FWIW, django-adminfiles hat auch ein paar neue Funktionen eingebaut, um den Datei-Browser als Select-Drop-Down-Ersatz zu verwenden: Ihr Modell würde also einen ForeignKey zum "FileUpload" -Modell haben Blättern Sie, um den ForeignKey zu füllen. Ist das näher an dem, wonach Sie suchen?

Ich habe dieses Feature seit einiger Zeit nicht mehr benötigt oder benutzt, es ist nicht dokumentiert oder getestet, und seit ich es hinzugefügt habe, gab es eine Menge Neuformatierung, so dass es funktioniert oder nicht. Aber es ist auf meiner ToDo-Liste, um es in Arbeitszustand eines dieser Tage wieder zu bekommen, und ich würde sicherlich nicht gegen ein wenig motivierte Hilfe einwenden ;-)

+1

Das ist näher an dem, was ich suche, aber nicht ganz.Um Abhängigkeiten von anderen Apps zu eliminieren, möchte ich, dass mein Model mit einem CharField/FileField/ImageField auskommt. Dann würde der Dateimanager das CharField nur mit dem relativen Pfad basierend auf der Benutzerauswahl aktualisieren. Sieht so aus, als ob django-adminfiles etwas ähnliches für die "Inlines" -Einfügung in Textareas tut. Wenn hier keine anderen Antworten angezeigt werden, werde ich wahrscheinlich versuchen, Ihre django-adminfiles zu ändern. (Nette App übrigens. Danke!) – zlovelady

+0

Wenn es ein Widget dafür gibt, könnte es möglich sein, das Widget zu ändern und es als Widget auf einem 'FilePathField' zu verwenden, was meiner Meinung nach wie ein' CharField' ist, das die Auswahl einschränkt zu einer Datei in einem bestimmten Pfad. – LeafStorm

+0

@zlovelady - das ist eine wirklich gute Idee für die entkoppelte Nutzung; Ich wäre nicht abgeneigt, solch ein Feature in django-adminfiles zu ziehen. –

1

Seit dem Stellen der Frage habe ich festgestellt, dass django-filebrowser eine hat FileBrowseWidget. Mit ein paar hässlichen Hacks konnte ich es im django Admin auf ImageField und FileField (nicht mehr filebrowser.fields.FileBrowseField benötigt auf dem Modell) arbeiten.

Ich benutze dies so (mit der non-grappelli-dependent django-filebrowser von wardi bei Github), und es scheint zu funktionieren.

# 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 

Dies ist ein bisschen hässlich, aber scheint für jetzt zu arbeiten. Es beseitigt die Model-Level-Abhängigkeit von django-filebrowser und schiebt die Abhängigkeit an den Admin, wo ich es haben wollte.

2

Als Ergänzung zu @zloveladys Antwort wollte ich auch den Django-Filebrowser von meinen Modelldefinitionen entkoppeln.

Vielleicht hat sich ihr Code seitdem geändert, aber das Rezept hat nicht mehr ganz funktioniert. Ich landete mit dieser bis bekommen es funktioniert (durch Unter Klassierung 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}) 
    ) 

Ich bin nicht mit der nicht-Grappelli-Version, aber ich glaube nicht, wichtig ist es, der entsprechende Code gleich aussah in beide Versionen.

+0

Das hat mir eine Tonne geholfen. – sdornan

Verwandte Themen