Próbuję załadować obraz za pośrednictwem administratora Django, a następnie wyświetlić ten obraz na stronie w interfejsie lub po prostu za pomocą adresu URL.
Pamiętaj, że to wszystko na moim komputerze lokalnym.
Moje ustawienia są następujące:
MEDIA_ROOT = '/home/dan/mysite/media/'
MEDIA_URL = '/media/'
Ustawiłem parametr upload_to na „images”, a plik został poprawnie przesłany do katalogu:
'/home/dan/mysite/media/images/myimage.png'
Jednak gdy próbuję uzyskać dostęp do obrazu pod następującym adresem URL:
http://127.0.0.1:8000/media/images/myimage.png
Otrzymuję błąd 404.
Czy muszę skonfigurować określone wzorce URLconf dla przesłanych multimediów?
Wszelkie porady są mile widziane.
Dzięki.
^
znak wcześniejmedia//(?P<path>.*)$
, kiedyś, gdy uzyskujemy dostęp do pliku multimedialnego na ścieżce adresu URL aplikacji (jakhttp://127.0.0.1:8000/myapp/media/img/logo.png
), ta zwykła matematyka nie będzie.Proszę uważnie przeczytać oficjalny Django DOC, a znajdziesz najbardziej odpowiednią odpowiedź.
Najlepszym i najłatwiejszym sposobem rozwiązania tego jest jak poniżej.
źródło
if settings.DEV
sprawdzania, ponieważ jest on wyłączany automatycznie?W przypadku Django 1.9 należy dodać następujący kod zgodnie z dokumentacją:
Więcej informacji można znaleźć tutaj: https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development
źródło
Oto, co zrobiłem w Django 2.0. Ustaw pierwszy MEDIA_ROOT na MEDIA_URL w
setting.py
Następnie włączyć
media
context_processors
wTEMPLATE_CONTEXT_PROCESSORS
dodającTwoja
media context processor
jest włączona, teraz każdaRequestContext
będzie zawierać zmiennąMEDIA_URL
.Teraz możesz uzyskać do tego dostęp w swoim
template_name.html
źródło
Tak. W przypadku programowania jest to tak proste, jak dodanie tego do URLconf:
Jednak w przypadku produkcji będziesz chciał obsługiwać media za pomocą Apache, lighttpd, nginx lub preferowanego serwera WWW.
źródło
(przynajmniej) dla Django 1.8:
Jeśli użyjesz
jak opisano powyżej, upewnij się, że żaden wzorzec adresu URL „catch all”, kierujący do domyślnego widoku, nie jest wcześniejszy niż w urlpatterns = []. Ponieważ .append umieści dodany schemat na końcu listy, zostanie on oczywiście przetestowany tylko wtedy, gdy żaden poprzedni wzorzec adresu URL nie pasuje. Można tego uniknąć, stosując coś takiego, w którym wzorzec adresu URL „catch all” jest dodawany na samym końcu, niezależnie od instrukcji if:
źródło
Oto zmiany, które musiałem wprowadzić, aby dostarczyć pliki PDF dla aplikacji django-publications przy użyciu Django 1.10.6:
Używasz tych samych definicji dla katalogów multimediów jak Ty, w
settings.py
:Jak zapewnia @thisisashwanipandey, w głównej części projektu
urls.py
:oraz modyfikacja odpowiedzi udzielonej przez @ r-allela w
settings.py
:źródło
Kolejnym problemem, z którym możesz się spotkać po skonfigurowaniu wszystkich wzorców URLconf, jest to, że zmienna
{{ MEDIA_URL }}
nie będzie działać w twoich szablonach. Aby to naprawić, w pliku settings.py upewnij się, że dodajeszw twoim
TEMPLATE_CONTEXT_PROCESSORS
.źródło
Dodanie do odpowiedzi Micheica Carricka dla django 1.8:
źródło
TypeError: view must be a callable or a list/tuple in the case of include().
.Tak zrobiłem, aby uzyskać renderowanie obrazów w trybie DEBUG = False w Pythonie 3.6 z Django 1.11
źródło
Postępując zgodnie z krokami wymienionymi powyżej dla => 3.0 dla trybu debugowania
A także część, która mnie złapała, powyższy statyczny adres URL działał tylko w moim głównym pliku urls.py projektu. Najpierw próbowałem dodać do mojej aplikacji i zastanawiałem się, dlaczego nie widziałem obrazów.
Na koniec upewnij się, że ustawiłeś:
źródło
Dzieje się tak, jeśli dla Django 1.10:
źródło
Twoje ustawienie jest w porządku. Niektóre serwery WWW wymagają szczególnego określenia plików folderów multimedialnych i statycznych. Na przykład w pythonanywhere.com musisz przejść do sekcji „Web” i dodać adres URL folderów multimediów i folderu statycznego. Na przykład:
Wiem, że jest późno, ale tylko po to, aby pomóc tym, którzy odwiedzają ten link z powodu tego samego problemu;)
źródło