我不确定如何将目录中的图像显示到页面上。我正在尝试创建一个图库应用。我正在尝试一点一点地做到这一点。我的目标是为相册创建缩略图(照片的第一张图像)。单击相册后,应显示所有图像。我认为这将通过AJAX请求完成。不太确定,因为我是Web开发的新手。我需要一些帮助来进行设置。
图片结构:
/gallery
/static
/images
/album1
img1
/album2
img2
...etc
我不确定如何在我的views.py中获取这些图像并将其显示在html页面上。
这是我想出的models.py,但可能需要更多工作:
class Album(models.Model):
title = models.CharField(max_length = 60)
def __unicode__(self):
return self.title
class Image(models.Model):
title = models.CharField(max_length = 60, blank = True, null = True)
tags = models.ManyToManyField(Tag, blank = True)
albums = models.ManyToManyField(Album, blank = True)
width = models.IntegerField(blank = True, null = True)
height = models.IntegerField(blank = True, null = True)
我觉得我的Image类中可能缺少一些东西,例如ImageField
或,FileField
但是我将文件手动放在目录中,所以我不确定是否需要。
在此阶段,不可能完全回答您的问题,但让我们看看。
答:目录和文件组织
尚不清楚目录结构如何与模型相似。
您的图像与相册之间存在N:M关系。到目前为止还可以。令人困惑的是您的图像结构。
该结构看起来像图像和相册的1:1关系。如果一张图像属于多个相册,是否会导致文件重复?
因此,您需要首先解决一件事:硬盘上的图像如何组织?
B:查找文件并从中创建URL
现在,我们需要找到一种方法来查找图像文件的路径。我们假设您的文件与django应用程序位于同一台计算机上,因此我们可以使用本地路径。如果您的图片位于AWS之类的其他位置,则需要提供其他机制来获取图片网址。
整理好之后,您可以为图像模型编写模型方法以检索图像路径。一种简单的方法是,标题是唯一的字段,并且确实等于图像文件名,该文件名也必须是唯一的。我向你保证,这仅适用于哈希文件名或非常奇怪的文件名约定,当文件上传到画廊时,这些约定必须由你自己来弥补。当然,还有其他选择可确保您获得正确的文件,但让我们保持简单,只是要记住一点。
C:一些示例代码
好吧,让我们写一些代码。这只是一个人为的例子,它想解释基本思想。有关目录遍历的更多信息,可以在这里找到:在Python中寻找类似于Java的文件遍历函数。
#models.py
import os
from os.path import join
class Image(models.Model):
def get_image_path(self):
for root, dirs, files in os.walk('<parents of gallery>/gallery/static/images/<album_if_required>'):
#debug information, just to get an idea how walk works.
#currently we are traversing over all files with any extension
print "Current directory", root
print "Sub directories", dirs
print "Files", files
for file in files:
if file.startswith(self.title):
#now we have found the desired file.
#value of file: "myimagetitle.jpg" <-- no path info
#value of root: "/home/yourhome/gallery/static/images/myalbum"
#we want to use this information to create a url based on our static path, so we need only the path sections past "static"
#we can achieve this like so (just one way)
mypath = os.sep.join(os.path.join(root, file).split(os.sep)[4:])
#yields: /images/myalbum/myimagetitle.jpg
return mypath
太好了,现在我们有了可以在模板中使用静态作为基础的路径。
#template.html
<!-- fancy html stuff goes here -->
<img src="{static myimage.get_image_path}">
<!-- more html -->
D:代码说明
我认为这段代码的某些部分需要解释。
os.walk是一个生成器方法,它将遍历您传递给它的路径。它将把路径返回到它查找的当前节点(根),以及您可以在下面找到的子目录(目录)和文件(文件)。您可以从树中删除节点或节点模式,因此可以对某些对象进行过滤。但是,这将立即进行。
找到文件候选者后,我们需要构建可在应用程序中使用的路径。HTML模板无法使用文件的物理位置,因此我们需要将其转换为URL。您将必须知道您的url方案是什么样的。我假设您依赖静态文件夹。
URL创建发生在这里:
os.sep.join(os.path.join(root, file).split(os.sep)[4:])
让我们看一下它:
os.path.join(root, file)
#加入根路径和一个长字符串的文件名
.split(os.sep)[4:]
#获取路径的子字符串。我们用目录分隔符char分隔路径,该分隔符是os依赖的。这将返回一个列表。我们只需要“静态”部分下的元素,在我的示例中,这导致列表的元素4
os.sep.join(...)
#最后但并非最不重要的一点是,我们必须再次构建一个字符串。因此,我们将所有列表元素与目录分隔符连接在一起,生成“ /images/myalbum/myimagetitle.jpg”
如您所见,这只是实现所需目标的一种可能方法。如果您提供有关文件组织方式的更多信息,我相信我们可以找到更好的方法。请不要上面的代码还没有准备好生产!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句