无法使用 Django 显示来自模型的图像
unable to display images from model usingo django
在settings.py
MEDIA_ROOT = os.path.join(BASE_DIR,'pictures')
MEDIA_URL = '/pictures/'
在models.py
class Campaign(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
# this is many to one relationship, on_deleting user, profile will also be deleted
campaign_title = models.CharField(max_length=200, blank=True)
campaign_image = models.ImageField(default="default_campaign.png",upload_to="campaign_pictures")
在views.py
def landing_page(request):
campaigns = Campaign.objects.all().order_by('-id')
print(campaigns)
return render(request, 'core/landing_page.html',{'campaigns':campaigns})
在landing_page.html
{% for campaign in campaigns %}
<img src="{{campaign.campaign_image.url}}">
{% endfor %}
问题
- 如果文件名为 abc xyz.jpg,它将作为 abc_xyz.jpg
保存到 /pictures/campaign_pictures
- 在html模板中,图片的src应该是'/pictures/campaign_pictures/abc_xyz.jpg'但它只显示'/pictures/abc%20xyz.jpg '
您可以将'upload_to'定义为可调用函数,并使用os.path将目录名称与媒体url连接起来。
您的字段将调用一个提供路径的函数。
campaign_image = models.ImageField(default="default_campaign.png",upload_to=get_campaign_path)
并像这样定义你的函数
import os
def get_campaign_path(instance, filename):
return os.path.join('campaign_pictures/',filename)
参考:
https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.FileField.upload_to
我想你错过了 urls.py 文件
from django.conf import settings
from django.conf.urls import url
from django.conf.urls.static import static
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
也更正为
campaign_image = models.ImageField(default="default_campaign.png",upload_to="campaign_pictures/")
在settings.py
MEDIA_ROOT = os.path.join(BASE_DIR,'pictures')
MEDIA_URL = '/pictures/'
在models.py
class Campaign(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
# this is many to one relationship, on_deleting user, profile will also be deleted
campaign_title = models.CharField(max_length=200, blank=True)
campaign_image = models.ImageField(default="default_campaign.png",upload_to="campaign_pictures")
在views.py
def landing_page(request):
campaigns = Campaign.objects.all().order_by('-id')
print(campaigns)
return render(request, 'core/landing_page.html',{'campaigns':campaigns})
在landing_page.html
{% for campaign in campaigns %}
<img src="{{campaign.campaign_image.url}}">
{% endfor %}
问题
- 如果文件名为 abc xyz.jpg,它将作为 abc_xyz.jpg 保存到 /pictures/campaign_pictures
- 在html模板中,图片的src应该是'/pictures/campaign_pictures/abc_xyz.jpg'但它只显示'/pictures/abc%20xyz.jpg '
您可以将'upload_to'定义为可调用函数,并使用os.path将目录名称与媒体url连接起来。
您的字段将调用一个提供路径的函数。
campaign_image = models.ImageField(default="default_campaign.png",upload_to=get_campaign_path)
并像这样定义你的函数
import os
def get_campaign_path(instance, filename):
return os.path.join('campaign_pictures/',filename)
参考: https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.FileField.upload_to
我想你错过了 urls.py 文件
from django.conf import settings
from django.conf.urls import url
from django.conf.urls.static import static
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
也更正为
campaign_image = models.ImageField(default="default_campaign.png",upload_to="campaign_pictures/")