2016-06-29 5 views
0

Django 1.9.7Kann nicht mit Bildern von einem Benutzer während der Entwicklung hochgeladen bewältigen

Können Sie mir helfen zu bewältigen Benutzer Bilder hochgeladen. Ich habe es geschafft, Bilder zu speichern.

Aber ich kann sie nicht zeigen. Bis jetzt ist das alles über Entwicklung Bühne (nicht Produktion).

Das unterste Codebeispiel zeigt den HTML-Code, wenn ich "Seitenquelle anzeigen" in Chrome ausführe. Dieser "src ="/home/michael/workspace/... "ist ein absoluter Pfad. Er funktioniert, wenn ich einen solchen HTML erzeuge und ihn ohne einen Webserver im Browser öffne.

Aber ich lasse den Django Dev-Server laufen , wird das Bild nicht zeigen.

Könnten Sie einen Kick geben Sie mir hier.

/pharchive/pharchive/settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, '../media/') 
MEDIA_URL = os.path.join(BASE_DIR, '../media/') 

/pharchive/pharchive/urls.py

from django.conf.urls.static import static 
if settings.DEBUG: 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

/pharchive/masterdocument/models.py

class Image(AbstractDocument): 
    image = models.ImageField(upload_to='images/%Y/%m/%d') 

/pharchive/masterdocument/views.py

class ImageDetailView(DetailView): 
    model = Image 

/pharchive/masterdocument/templates/masterdocument /image_detail.html

<html> 
    <img src="{{ object.image.url }}"/> 
</html> 

view-source: http://localhost:8000/images/6/

<html> 
    <img src="/home/michael/workspace/pharchive/media/images/2016/06/29/Screenshot_from_2016-02-23_205205.png"/>  
</html> 
+0

Wenn Sie nur über die Entwicklung besorgt sind, wie Sie gesagt haben, dann wird das Hinzufügen von 'file: //' vor der URL es für eine Weile "arbeiten" lassen. – Brian

+0

Nun, ich bin jetzt in der Entwicklungsphase. Was Sie sagen, ist Hardcoding. In der Entwicklung wird es in Zukunft nicht funktionieren. – Michael

+0

Genau das meinte ich mit "Arbeit" ja. Ich werde es nicht empfehlen nach den nächsten 10 Minuten. – Brian

Antwort

0

MEDIA_URL sollte der Stamm-URL für hochgeladene Medien, zum Beispiel:

MEDIA_URL = '/media/' 

Sie haben es auf den Pfad gesetzt die die Ordner, in den hochgeladene Medien kopiert werden.

Edit: wie angefordert mehr Informationen darüber, wie das funktioniert.

Sie versuchen, eine von einem Benutzer gesendete Bilddatei zu speichern und dann an andere Benutzer zu senden.Um die Datei zu speichern, müssen Sie einen Speicherort auf dem Dateisystem angeben, wo sie gespeichert wird, in Ihrem Fall:

/home/michael/workspace/pharchive/media/images/2016/06/29/Screenshot_from_2016-02-23_205205.png

Django baut diesen Weg durch diese Teile verketten:

  • die MEDIA_ROOT
  • die ImageField ‚s interpoliert upload_to Attribut, hier 'images/%Y/%m/%d' zu images/2016/06/29 interpoliert
  • die fil e Name, hier Screenshot_from_2016-02-23_205205.png.

Django speichert auch in der Datenbank des Pfad zur Datei, bezogen auf die MEDIA_ROOT, in Ihrem Fall images/2016/06/29/Screenshot_from_2016-02-23_205205.png

nun die gespeicherte Datei an den Benutzer dienen, muss es zuerst zugänglich durch eine sein URL, diese URL wird durch Verkettung der MEDIA_URL Einstellung mit dem in der Datenbank gespeicherten Pfad erstellt (möglicherweise geändert, um URL-kompatibel zu machen), hier gibt es /media/images/2016/06/29/Screenshot_from_2016-02-23_205205.png.

Der letzte Schritt besteht darin, die Datei tatsächlich zu bedienen, wenn auf die zuvor erstellte URL zugegriffen wird. In der Regel wird dies in der Entwicklung und in der Produktion nicht auf die gleiche Weise erfolgen.

In der Entwicklung wird der Django Devserver verwendet, um die Datei zu liefern, weshalb Sie ein URL-Muster hinzufügen, wenn DEBUG wahr ist. Dieses URL-Muster wird jede URL beginnend mit MEDIA_URL (/media/) einer Ansicht zuordnen, die die gespeicherte Datei liest und ihren Inhalt zurückgibt.

In der Produktion verwenden Sie aus Leistungsgründen einen dedizierten Webserver, um hochgeladene Dateien zu liefern.

+0

Arbeiten. Ich werde diese Antwort akzeptieren. Aber könntest du noch ein paar Minuten verbringen und mir helfen zu verstehen, was hier vor sich geht. Ich dachte, dass MEDIA_URL in diesem Fall überhaupt nicht verwendet wird. Also schreibe ich einfach etwas zufällig hinein. Und jetzt scheint es, dass dieser Pfad zu produktiven Mediendateien die Darstellung von Bildern in der Entwicklungsstufe beeinflusst. Das ist ein Rätsel für mich. – Michael

+0

Die 'MEDIA_URL' wird verwendet, weil Sie Mediendateien anfordern, die von einem Benutzer hochgeladen wurden. Dies ist das gleiche, wenn Ihr Dev-Server statische Dateien anfordert, wird die 'STATIC_URL' für die Anfrage verwendet. Wenn Sie die Bereitstellung in der Produktion durchführen oder wenn Sie einen Testserver zum Testen haben, müssen Sie Ihrem Webserver (wie NGINX oder Apache) mitteilen, wo die statischen Dateien und Mediendateien gespeichert sind. –

Verwandte Themen