无法使用 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 %}

问题

  1. 如果文件名为 abc xyz.jpg,它将作为 abc_xyz.jpg
  2. 保存到 /pictures/campaign_pictures
  3. 在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/")