2016-05-08 12 views
1

Ich habe ein Projekt, das 3 Apps hat, ein benannt speichert mit Store-Modelle, Produkte mit Produktmodellen, und API ist die Rest Framework App, die die JSON-Ergebnisse für Kunden dient . Ich habe den Media-Root in settings.py als MEDIA_ROOT = '/photos/' festgelegt und der Upload funktioniert sowohl für Produkt- als auch für Geschäftsmodelle. Das Hauptproblem hierbei ist, dass das Rest-Framework aus irgendeinem Grund eine URL zurückgibt, die auf die API-App verweist, anstatt auf die Produkte, oder Apps für die Medienstamm-URL speichert. hier sind meine ModelleDjango Rest App verwendet Medienstamm nicht korrekt, um Bilder zu liefern

class Product(models.Model): 

def get_image_path(instance, filename): 
    return '/Products/' + filename 

picture = models.ImageField(width_field=None, max_length=100, blank =True, null =True) 

store:

class Store(models.Model): 


def __str__(self): 
    return self.name 


def get_image_path(instance, filename): 
    return os.path.join('productphotos', 'stores', filename) 

picture = models.ImageField(width_field=None, max_length=100, blank =True, null =True) 

Wie ich das mediaroot in das Projektverzeichnis festgelegt haben, statt, so dass alle Anwendungen im Projekt als mediaroot selbst statt verweisen?

Der Upload funktioniert und uploads die Bilder zu den angewiesenen Verzeichnissen im Stamm des Projekts (wo manage.py gefunden wird), aber das Rest-Framework denkt, dass es die Medien aus der API-App bekommen sollte. Was ist der richtige Weg das zu tun? hier sind Screenshots:

der Pfad hochgeladen Successful upload path

den Weg in json zurück Path returned by DRF

+2

Sie nicht genug Informationen hier vorsah. Was ist die erwartete URL - eine Zeichenkette, was gibt das Django REST Framework zurück? Wieso ist einer deiner Upload_to absolut? – Linovia

+0

Ich habe es bearbeitet, um weitere Informationen zur Verfügung zu stellen, der aktuelle Weg brachte einen Fehler beim Hochladen (Ich habe vergessen, nach dem Ändern zu testen) Also habe ich es gerade zurück zu seinem vorherigen Verhalten bearbeitet (loswerden der Methode get_image_path) –

+0

Es gibt immer noch einige Inkonsistenzen. Der Bildpfad in dem Bild unterscheidet sich von dem "MEDIA_ROOT" in den Einstellungen. Sind Sie sicher, dass Ihre 'MEDIA_ROOT' Einstellungen absolut sind? – Linovia

Antwort

4

Die MEDIA_URL Einstellung ist der URL-Pfad im Browser. Die MEDIA_ROOT Einstellung ist das Stammverzeichnis auf Ihrem Server und sollte ein absoluter Pfad sein.

MEDIA_URL = '/pictures/' 

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploaded_pictures') 

Auch, wenn Sie wollen Product und Store Bilder in verschiedene Unterverzeichnisse zu gehen, zum Beispiel pictures/products/ und pictures/store/, würden Sie das upload_to Argument auf dem Modellfeld festlegen müssen. Zum Beispiel

picture = models.ImageField(upload_to='products/', ...) 

Edit: Um statische und Mediendateien während der Entwicklung zu dienen, fügen Sie diese am Ende des urls.py

if settings.DEBUG: 
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
    from django.conf.urls.static import static 

    urlpatterns += staticfiles_urlpatterns() 
    urlpatterns += static(
     settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 
+0

Danke, es funktioniert jetzt .. der Pfad bleibt der gleiche, aber die letzte Frage ist, wie dies zu einem Client cs dient es sagt nur Seite nicht gefunden, wenn ich auf den Link im Browser klicken .. brauche ich separaten Server oder reicht der django dev server? –

+1

Der Dev-Server muss angewiesen werden, das Verzeichnis zu bedienen, ich habe es der Antwort hinzugefügt. – C14L

+0

Ich habe hinzugefügt, versuchte vor und nach der Zeile 'urlpatterns = format_suffix_patterns (urlpatterns)', aber es gibt immer noch 404 Fehler –