如何在Django模板中显示img文件?

时间:2020-03-26 21:12:56

标签: django django-templates

我知道标题有点误导,但我会解释所有内容。我正在django中创建商店,但是有一个小问题,我不知道该如何解决。好吧,对于每种产品,我想分配几张保存在数据库中的照片。这就是为什么我创建了Photo模型的原因,该模型通过Book连接到ForeignKey模型。

整个问题是我不知道如何在商店的首页上显示分配给特定书籍的照片之一。当然,页面上有许多for loop中生成的书。

如果有帮助,我将每本书的图片保存在一个单独的文件夹中,功能content_file_name负责

当然,我愿意接受其他想法来实现如上所述的效果。我不确定我选择的路径是否最佳。

#models.py

def content_file_name(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (instance.book.slug, ext)
    return os.path.join('books_img', instance.book.slug, filename)


class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=300)
    publisher = models.CharField(max_length=100)
    price = models.FloatField()
    slug = models.SlugField()
    seller = models.ForeignKey(User, on_delete=models.CASCADE)


class Photo(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    file = models.ImageField(default=random_img, upload_to=content_file_name)
    uploaded_at = models.DateTimeField(auto_now_add=True)

1 个答案:

答案 0 :(得分:0)

这实际上是一个关系问题,而不是编码问题。让我们深入研究

这是您的Book类的简短版本,用于说明。

class Book(models.Model):
    pass

这是您的Photo类的简短版本,用于说明。

class Photo(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    file = models.ImageField(default=random_img, upload_to=content_file_name)

什么是ForiegnKey? -ForiegnKey只是ManyToOne的名字,对吗?,这里有多少,又是什么?

好吧,我们有一本书,里面有多张照片。因此,照片有一个Key,就像门钥匙一样,它仅打开 这是门,这是Key

您的Photo类具有一个名为book的类变量。调用起来就像Photo.book。但是,由于django也起作用,因此调用反向关系将是book.photo_qs,其中photo_qs是反向关系的默认名称。

让我们改善它。

class Photo(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='photos')
    file = models.ImageField(default=random_img, upload_to=content_file_name)

现在,和以前一样,它仍然是photo.bookbook.photos(来自相关名称)

用英语,每个图书实例都有.photos(具有相关经理类型)。因此,如果您得到这样的书

my_book = Book.objects.all()[0]

本书的.photos类型(“相关经理”),使用起来就像

my_book.photos.all()

到这里都可以,现在的问题是,您想将包含书本详细信息的图像发送到模板中,

您的视图是

def my_view(request):
    my_book = Book.objects.all()[0] # first book
    return render(request, 'my_template_path', context= {
        'my_book': my_book,
        })

现在,您的模板可以访问my_book变量。

在您的模板中

{% for photo in my_book.photos.all %}
        <img src="{{ photo.file.url }}">
{% endfor %}

根据您的需要进行编辑。