Как я могу использовать загруженные пользователем файлы в моих шаблонах? (Джанго)
До сих пор я сделал это в той части, где пользователь загружает изображение, но как я могу использовать те изображения, которые находятся в моей папке мультимедиа? Вот что я попробовал:
мой взгляд:
#I even tried to import MEDIA_ROOT to use it in my template...
#from settings import MEDIA_ROOT
def home(request):
latest_images = Image.objects.all().order_by('-pub_date')
return render_to_response('home.html',
#{'latest_images':latest_images, 'media_root':MEDIA_ROOT},
{'latest_images':latest_images,},
context_instance=RequestContext(request)
)
моя модель:
class Image(models.Model):
image = models.ImageField(upload_to='imgupload')
title = models.CharField(max_length=250)
owner = models.ForeignKey(User)
pub_date = models.DateTimeField(auto_now=True)
мой шаблон:
{% for image in latest_images %}
<img src="{{ MEDIA_ROOT }}{{ image.image }}" width="100px" height="100px" />
{% endfor %}
и мои settings.py MEDIA_ROOT и URL:
MEDIA_ROOT = '/home/tony/Documents/photocomp/photocomp/apps/uploading/media/'
MEDIA_URL = '/media/'
Итак, еще раз вот что я пытаюсь сделать: использовать эти изображения в моих шаблонах!
5 ответов
На компьютере разработчика вы должны указать devserver, чтобы он обслуживал загруженные файлы.
# in urls.py
from django.conf import settings
if settings.DEBUG:
urlpatterns += patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT,
}),
)
{# in template, use sorl-thumbnail if your want to resize images #}
{% with image.image as img %}
<img src="{{ img.url }}" width="{{ img.width }}" height="{{ img.height }}" />
{% endwith %}
# furthermore, the view code could be simplified as
from django.shortcuts import render
def home(request):
latest_images = Image.objects.order_by('-pub_date')
return render(request, 'home.html', {'latest_images':latest_images})
В производственной среде, использующей обычное хранилище файловой системы, убедитесь, что веб-сервер имеет разрешение на запись в MEDIA_ROOT. Также настройте веб-сервер для чтения /media/filename
с правильного пути.
Если вы используете url
атрибутов, MEDIA_URL
автоматически добавляется. использование name
если вы хотите путь без MEDIA_URL
, Так что все, что вам нужно сделать, это:
<img src="{{ some_object.image_field.url }}">
ImageField() имеет url
атрибут так попробуй:
<img src="{{ MEDIA_URL }}{{ image.image.url }}" />
Вы также можете добавить метод к вашей модели, например, чтобы пропустить часть MEDIA_ROOT:
from django.conf import settings
class Image(...):
...
def get_absolute_url(self):
return settings.MEDIA_URL+"%s" % self.image.url
Также я бы использовал upload_to, как это для здравомыслия:
models.ImageField(upload_to="appname/classname/fieldname")
Попробуйте эти настройки:
import socket
PROJECT_ROOT = path.dirname(path.abspath(__file__))
# Dynamic content is saved to here
MEDIA_ROOT = path.join(PROJECT_ROOT,'media')
if ".example.com" in socket.gethostname():
MEDIA_URL = 'http://www.example.com/media/'
else:
MEDIA_URL = '/media/'
# Static content is saved to here
STATIC_ROOT = path.join(PROJECT_ROOT,'static-root') # this folder is used to collect static files in production. not used in development
STATIC_URL = "/static/"
STATICFILES_DIRS = (
('', path.join(PROJECT_ROOT,'static')), #store site-specific media here.
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
Для Django версии 2.2. Попробуйте следующее:
#You need to add the following into your urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
Your URL mapping
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #add this
# And then use this in your html file to access the uploaded image
<img src="{{ object.image_field.url }}">
Вы должны сделать папку, содержащую загруженные изображения, "доступной через Интернет", т. Е. Либо использовать Django для обслуживания статических файлов из папки, либо использовать для этого выделенный веб-сервер.
Внутри кода вашего шаблона вы должны использовать MEDIA_URL
ценности.