it-swarm.com.de

Bilder von ImageField in Django werden nicht in der Vorlage geladen

Ich baue eine Galerie mit Django (1.5.1) auf meinem lokalen Rechner. In meinem Album-Modell habe ich eine ImageField. Es gibt eine Ansicht, um alle Bilder eines Albums anzuzeigen. Es funktioniert gut, aber am Ende werden keine Bilder angezeigt. Wie Sie sehen, gibt es einen Bildrand, aber die Bilder werden nicht geladen. 

bildschirmfoto

enter image description here

models.py

class Category(models.Model):
 ###  
class Album(models.Model):   
    category = models.ForeignKey(Category, related_name='albums')
 ###
class Image(models.Model):
    album = models.ForeignKey(Album)
    image = models.ImageField(upload_to = 'images/albums/')

views.py

def detail(request, album_id):
    album = get_object_or_404(Album, pk=album_id)
    return render(request, 'gallery/detail.html', {'album': album})

detail.html

<h1>{{ album.title }}</h1>
{% for image in album.image_set.all %}
  <a>  <img src="{{ image.image.url }}" height="420"></a>
{% endfor %}

Wenn dies meine Albumadresse ist: http://localhost:8000/gallery/1/ 

Dann lautet die Bild-URL: http://localhost:8000/media/images/albums/photo_4.JPG (I get 404 when enter it in browser) 

Dieser Medienstamm und diese URL: 

MEDIA_ROOT = '/media/'    
MEDIA_URL = '/localhost:8000/media/'  

Mein Medienstamm hat 777 Berechtigung .

Was sollte ich jetzt tun? Wo ist das Problem?

14
sheshkovsky

Ich habe eine Ahnung, was das Problem ist. MEDIA_URL sollte so sein:

MEDIA_ROOT='<the full path to your media folder>' (i.e: '/home/ike/project/media/')
MEDIA_URL='/media/'

Beachten Sie den Schrägstrich am Anfang. Das liegt daran, dass es sich bei media um einen Ordner in Ihrem Root-Server-Ordner handelt und nicht relativ zu der von Ihnen aufgerufenen anderen URL.

Fügen Sie diese Zeilen am Ende Ihrer urls.py-Datei hinzu:

# You might need to import static function like this:
#from Django.contrib.staticfiles.urls import static

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

Sie können die folgende Dokumentation überprüfen: https://docs.djangoproject.com/en/dev/howto/static-files

Hoffe das hilft

31
Paulo Bu

Wenn Sie den Dev-Server verwenden, müssen Sie etwas zu Ihrer urls.py hinzufügen, damit Django die Mediendateien bereitstellt, cf:

1.4.x: https://docs.djangoproject.com/de/1.4/howto/static-files/#serving-other-directories 1.5.x: https: //docs.djangoproject .com/de/dev/howto/static-files/# Serving-Dateien-hochgeladen von einem Benutzer

5

Quelle: https://docs.djangoproject.com/de/dev/howto/static-files/#serving-files-uploaded-by-a-user

 from Django.conf import settings
from Django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

sie müssen zum URL-Muster hinzufügen, um hochgeladene Dateien bereitzustellen

2
Saher Ahwal

Ändern Sie innerhalb Ihrer details.html Ihre 

img src="{{ image.image.url }}" height="420"

Zu 

img src="your_app/media/{{ image.image.url }}" height="420"

Ich hoffe das hilft. Wenn nicht, werde ich gerne weitere Informationen geben.

1
Amimo Benja

Überprüfen Sie Ihre settings.py Sie definieren MEDIA_ROOT und 'MEDIA_URL' (und sie sind korrekt). MEDIA_ROOT gibt einen absoluten Ordner auf Ihrem Computer an, in dem Medien gespeichert werden. 

Also zum Beispiel:

MEDIA_ROOT = '/myfolder/'

Dies würde bedeuten, dass es nach Image suchen würde:

/myfolder/images/albums/

Als nächstes in Ihrer settings.py überprüfen Sie Ihren MEDIA_ROOT-Speicherort: d.

MEDIA_URL = 'http://localhost/myfolder/'

Also deine Bilder:

<img src="{{ MEDIA_URL }}{{ image.image.url }}" height="420"></a>

Dies würde sich beziehen auf:

http://localhost/myfolder/images/albums/

Hoffe das hilft.

1
Glyn Jackson

Ich habe etwas von jeder der obigen Antworten genommen. Ich hatte das gleiche Problem wie du. Ich erhielt Rückgaben, die vom aktuellen /blog/post/(media_url)/image.jpg geleitet wurden 

In meinem Admin-Portal konnte ich es leicht anzeigen und bearbeiten. Aber auf meiner post.html hatte ich Probleme, bis ich die {{MEDIA_URL}} - 

Das ist alles, was mir gefehlt hat.

Ich habe meinen gesamten Abschnitt hier veröffentlicht, damit andere ihn lesen und sehen können, was ihnen fehlt. 

post.html:

    <label for="id_image">  <img src="{{ MEDIA_URL }}{{ p.image.url }}" 
    title="{{ p.title }}"> </label>

models.py:

    from Django.core.files.storage import FileSystemStorage

    upload_location =
    FileSystemStorage(location='/home/pi/djcode/xpcpro/xpcpro/images')

    class Blog(models.Model):
        title = models.CharField(max_length=255)
        author = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
        date = models.DateTimeField(auto_now=False, auto_now_add=True)
        body = models.TextField()
        image = models.ImageField(
            storage=upload_location, null=True,
            blank=True, width_field="width_field",
            height_field="height_field",)
        height_field = models.IntegerField(default=0)
        width_field = models.IntegerField(default=0)

urls.py:

    from Django.conf.urls.static import static
    from Django.contrib.staticfiles.urls import staticfiles_urlpatterns

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

settings.py:

    MEDIA_ROOT = "/home/pi/djcode/xpcpro/xpcpro/images/"
    MEDIA_URL = "/images/"
0
jMrL

Nun, ich weiß, dass diese Frage alt ist, aber ich habe sie jetzt gelöst, nachdem alle Optionen geprüft wurden:

  1. einstellungen.py:
 MEDIA_URL = '/media/'
 MEDIA_ROOT = os.path.join (BASE_DIR, 'media') 
  1. urls.py GEFAHR !!! Hier war einer meiner Fehler, dass ich my_app/urls.py verwendet habe ... Wenn Sie my_app/urls.py verwenden möchten, müssen Sie "/ namespace_name {{image.image.url}}" zu img 'src hinzufügen:
 von Django.conf.urls.static importieren Sie statisch 
 von Django.contrib.staticfiles.urls importieren Sie staticfiles_urlpatterns 
 von Django.conf Importeinstellungen 

 urlpatterns + = staticfiles_urlpatterns () 
 urlpatterns + = static (settings.MEDIA_URL, document_root = settings.MEDIA_ROOT) 
  1. Ihre Vorlage detail.html
 img src = "{{image.image.url}}" alt = "{{image.title}}" 

HINWEISE: Sie benötigen MEDIA_URL nicht. Seien Sie vorsichtig mit '/', da image.image.url absolut ist. Wenn Sie also einen Namespace verwenden, müssen Sie keinen End-Schrägstrich hinzufügen.

 img src = "/ namespace_name/{{image.image.url}}" -> BAD !!! 
 img src = "/ namescape_name {{image.image.url}}" -> GUT !!! 
0
Leaf