Django - 来自 MEDIA_URL 的图像没有显示在模板上?
Django - Image from MEDIA_URL not showing up on template?
所以我已经阅读了很多关于这个问题的堆栈溢出答案,但其中 none 似乎可以解决我的问题。我已经设置了 MEDIA_ROOT、MEDIA_URL、STATIC_ROOT 和 STATIC_URL,但由于某些原因,我的 media_url 中的图像没有显示在我的模板上,而来自我的 static_url 是。
下面是我的代码以及进一步的解释。
Settings.py
STATICFILES_DIRS = (
('/static/',
'/home/joe/Documents/exchange/Texchange/textchange/static',),
('/media/',
'/home/joe/Documents/exchange/Texchange/textchange/media/',),
)
MEDIA_ROOT = '/home/joe/Documents/exchange/Texchange/textchange/media/'
MEDIA_URL = '/media/'
STATIC_ROOT = '/home/joe/Documents/exchange/Texchange/textchange/'
STATIC_URL = '/static/'
Models.py
class Posting(models.Model):
textbook = models.ForeignKey(Textbook)
condition = models.CharField(max_length = 200)
price = models.DecimalField(max_digits=5, decimal_places=2)
user = models.ForeignKey(User)
image = models.ImageField(upload_to='postingpics/%Y/%m/%d', default="../../static/textchange/nophoto.jpg")
post_date = models.DateTimeField('date_posted')
def __str__(self):
return str(self.textbook)
def was_posted_recently(self):
return self.post_date >= timezone.now() - datetime.timedelta(days=1)
was_posted_recently.admin_order_field = 'post_date'
was_posted_recently.boolean = True
was_posted_recently.short_description = 'Posted recently'
Template.html
<div class="row marketing">
<div class="col-lg-6">
<h3>Textbook Info</h3>
<p><strong>Textbook: </strong>{{ posting.textbook.textbook_name }}</p>
<p><strong>Condition: </strong>{{ posting.condition }}</p>
<p><strong>Price: </strong>{{ posting.price }}</p>
<p><strong>Class: </strong>{{ posting.textbook.class_name }}</p>
<p><strong>ISBN: </strong>{{ posting.textbook.isbn }}</p>
<p><strong>Author: </strong>{{ posting.textbook.author }}</p>
<h3>Contact Info</h3>
<p><strong>User: </strong>{{ posting.user.username }}</p>
<p>Button to contact</p>
</div>
<div class="col-lg-6">
{% block content %}
<img src="{{ posting.image.url }}">
<p>{{ posting.image.url }}</p>
{% endblock %}
</div>
</div>
因此,如您所见,如果我不为发布上传图片,它会转到存储在 static/textchange 中的默认图片。此图像将显示在模板上。如果我确实上传了图片,该图片将不会显示在模板上。在我的 template.html 中,段落标签中有文本 {{ posting.image.url }} 以查看不同图像的 url 是什么样子。
当使用 static/textchange 中的默认图像时,url 是:/../static/textchange/nophoto.jpg 并且图像显示正常。
当我尝试在模板中显示上传的图像时,url 是:/media/postingpics/2015/09/20/Star-Wars-Sith-Code-Wallpaper-2_dlPszgQ.jpg 并且没有图像显示...
我觉得静态图片在 static 前面有 /../ 很奇怪,但我不知道为什么它只显示来自静态文件夹的图片。
如有任何帮助,我们将不胜感激。
MEDIA_URL 不会由 Django 自动提供,您必须手动设置。 https://docs.djangoproject.com/en/1.8/howto/static-files/#serving-files-uploaded-by-a-user-during-development
此外,您对静态文件和媒体文件的设置很奇怪:
- 你的 MEDIA_ROOT 在你的 STATIC_ROOT 里面。为什么?
- 你的 STATICFILES_DIRS 在你的 STATIC_ROOT 里面。这真的没有任何意义。 STATICFILES_DIRS 应该收集到您的 STATIC_ROOT。
- 您的 MEDIA_ROOT 在 STATICFILES_DIRS 中设置为静态文件目录。根据定义,媒体文件不是静态文件。删除这个。
您似乎想要更像这样的东西:
STATICFILES_DIRS = (
'/home/joe/Documents/exchange/Texchange/textchange/static',
)
MEDIA_ROOT = '/home/joe/Documents/exchange/Texchange/textchange/media/'
MEDIA_URL = '/media/'
STATIC_ROOT = '/home/joe/Documents/exchange/Texchange/textchange/static_root/'
STATIC_URL = '/static/'
假设 Texchange/textchange
是您的项目根目录。
所以我已经阅读了很多关于这个问题的堆栈溢出答案,但其中 none 似乎可以解决我的问题。我已经设置了 MEDIA_ROOT、MEDIA_URL、STATIC_ROOT 和 STATIC_URL,但由于某些原因,我的 media_url 中的图像没有显示在我的模板上,而来自我的 static_url 是。
下面是我的代码以及进一步的解释。
Settings.py
STATICFILES_DIRS = (
('/static/',
'/home/joe/Documents/exchange/Texchange/textchange/static',),
('/media/',
'/home/joe/Documents/exchange/Texchange/textchange/media/',),
)
MEDIA_ROOT = '/home/joe/Documents/exchange/Texchange/textchange/media/'
MEDIA_URL = '/media/'
STATIC_ROOT = '/home/joe/Documents/exchange/Texchange/textchange/'
STATIC_URL = '/static/'
Models.py
class Posting(models.Model):
textbook = models.ForeignKey(Textbook)
condition = models.CharField(max_length = 200)
price = models.DecimalField(max_digits=5, decimal_places=2)
user = models.ForeignKey(User)
image = models.ImageField(upload_to='postingpics/%Y/%m/%d', default="../../static/textchange/nophoto.jpg")
post_date = models.DateTimeField('date_posted')
def __str__(self):
return str(self.textbook)
def was_posted_recently(self):
return self.post_date >= timezone.now() - datetime.timedelta(days=1)
was_posted_recently.admin_order_field = 'post_date'
was_posted_recently.boolean = True
was_posted_recently.short_description = 'Posted recently'
Template.html
<div class="row marketing">
<div class="col-lg-6">
<h3>Textbook Info</h3>
<p><strong>Textbook: </strong>{{ posting.textbook.textbook_name }}</p>
<p><strong>Condition: </strong>{{ posting.condition }}</p>
<p><strong>Price: </strong>{{ posting.price }}</p>
<p><strong>Class: </strong>{{ posting.textbook.class_name }}</p>
<p><strong>ISBN: </strong>{{ posting.textbook.isbn }}</p>
<p><strong>Author: </strong>{{ posting.textbook.author }}</p>
<h3>Contact Info</h3>
<p><strong>User: </strong>{{ posting.user.username }}</p>
<p>Button to contact</p>
</div>
<div class="col-lg-6">
{% block content %}
<img src="{{ posting.image.url }}">
<p>{{ posting.image.url }}</p>
{% endblock %}
</div>
</div>
因此,如您所见,如果我不为发布上传图片,它会转到存储在 static/textchange 中的默认图片。此图像将显示在模板上。如果我确实上传了图片,该图片将不会显示在模板上。在我的 template.html 中,段落标签中有文本 {{ posting.image.url }} 以查看不同图像的 url 是什么样子。
当使用 static/textchange 中的默认图像时,url 是:/../static/textchange/nophoto.jpg 并且图像显示正常。
当我尝试在模板中显示上传的图像时,url 是:/media/postingpics/2015/09/20/Star-Wars-Sith-Code-Wallpaper-2_dlPszgQ.jpg 并且没有图像显示...
我觉得静态图片在 static 前面有 /../ 很奇怪,但我不知道为什么它只显示来自静态文件夹的图片。
如有任何帮助,我们将不胜感激。
MEDIA_URL 不会由 Django 自动提供,您必须手动设置。 https://docs.djangoproject.com/en/1.8/howto/static-files/#serving-files-uploaded-by-a-user-during-development
此外,您对静态文件和媒体文件的设置很奇怪:
- 你的 MEDIA_ROOT 在你的 STATIC_ROOT 里面。为什么?
- 你的 STATICFILES_DIRS 在你的 STATIC_ROOT 里面。这真的没有任何意义。 STATICFILES_DIRS 应该收集到您的 STATIC_ROOT。
- 您的 MEDIA_ROOT 在 STATICFILES_DIRS 中设置为静态文件目录。根据定义,媒体文件不是静态文件。删除这个。
您似乎想要更像这样的东西:
STATICFILES_DIRS = (
'/home/joe/Documents/exchange/Texchange/textchange/static',
)
MEDIA_ROOT = '/home/joe/Documents/exchange/Texchange/textchange/media/'
MEDIA_URL = '/media/'
STATIC_ROOT = '/home/joe/Documents/exchange/Texchange/textchange/static_root/'
STATIC_URL = '/static/'
假设 Texchange/textchange
是您的项目根目录。