Django 3.0图片:无法在模板中显示图片

时间:2020-05-05 14:59:40

标签: python django django-models django-views django-templates

在models.py文件中有一个名为Book的模型。

并基于此模型,创建了一个视图以将图像显示为产品。

哪个在shop.html模板上呈现书籍(产品)。

问题是我无法获得他们的封面图像,这些图像被保存在那些书的卖方的每个出版商ID中。



这是shop.html的代码(我试图在其中显示图像)。

            <div class="container mt-4">
            <div class="row">
                {% for b in books|slice:":10" %}
                    <div class="col-lg-2 col-md-3 col-sm-4">
                        <div class="book-card">
                            <div class="book-card__book-front">
                                <img src={{MEDIA_URL}}{{b.cover.url}} alt="book-image">
                            </div>      
                        </div>
                                <div class="book-card__title">
                                    {{ b.title }}
                                </div>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>

这是我将书的封面与出版商的ID(名称)相对应的模型

def book_cover_path(instance, filename):
    return os.path.join(
    "covers", instance.publisher.user.username,  str(
        instance.pk) + '.' + filename.split('.')[-1]
)

class Book(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField('Title', max_length=255)
    authors = models.ManyToManyField(Author, related_name='books_written')
    publisher = models.ForeignKey(Publisher, on_delete=models.DO_NOTHING, related_name='books_published')
    price = models.DecimalField('Price', decimal_places=2, max_digits=10)
    description = models.TextField('Description')
    upload_timestamp = models.DateTimeField('Uploading DateTime', auto_now_add=True)
    categories = models.ManyToManyField(Category, related_name='book_category')
    cover = models.ImageField(upload_to=book_cover_path, null=True,blank=True)

    class Meta:
        unique_together = ('title', 'publisher')
        get_latest_by = '-upload_timestamp'

这是views.py中的视图

def shop(req):
bookz = Book.objects.order_by('title')
var = {'books': bookz, 'range': 10}
return render(req, 'bookrepo/shop.html', context=var)

这是settings.py中的媒体设置。

 MEDIA_URL = '/media/'
 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

这是我的文件夹结构,我确实将封面放在media / covers / publisher / image.jpg中,即使我尝试过类似media / media / covers / publisher / image.jpg之类的东西

This is structure of media directory

我在django控制台中收到未找到的错误

Not found error like these

我认为这与我尝试创建的url一定有关系。

否则b.title可以正常工作。问题只在于图像检索。

如果有人不了解book_cover_path函数,他们可以告诉我制作url的方式,就好像书躺在media / covers / image.jpg中一样,因为我也不能这样做。

cover = models.ImageField(upload_to='covers', null=True,blank=True)

2 个答案:

答案 0 :(得分:0)

在shop.html上尝试此操作,检查文档here

<img src="{{ b.cover.url }}" alt="book-image">

答案 1 :(得分:0)

替换此行

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

             to

MEDIA_ROOT = os.path.join(BASE_DIR,'media/')

因为保存文件的目录是绝对路径。

并替换

<img src={{MEDIA_URL}}{{b.cover.url}} alt="book-image">

              to
<img src="{{b.cover.url}}" alt="book-image">

并将这些行添加到项目url.py文件中

from django.conf import settings
from django.conf. urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),

] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)