我有约。 100.000图片和我的目标是生成一个Django支持的网页,每次页面加载时随机显示其中一张图片(实际上它有点复杂,但这是我的最小例子)。我现在的方法如下:
我的视图模板如下所示:
...
<body>
<H1>'Hello World' from the template!</H1>
Here's a random image: "{{rImage}}"<p>
<canvas class="stream" id="canvas" style="z-index: 1; outline: 1px solid red;" width=505px height=336px></canvas>
<script>
var canvas = document.getElementById("canvas");
var cxt = canvas.getContext("2d");
img = new Image();
img.onload = function(){};
img.src = "/static/rim/{{rImage}}";
cxt.drawImage(img,0,0,canvas.width,canvas.height);
</script>
</body>
...
{{rImage}}是随机图像的路径。如您所见,我实际上是使用Javascript将图像绘制到HTML5画布上。这是Python中相应的Django视图:
def index(request):
rImage = Images.objects.all()[random.randint(0, 100000)].relativeUrl
template = loader.get_template('rim/index.html')
context = RequestContext(request,{'rImage':rImage})
return HttpResponse(template.render(context))
虽然这确实有效,但我很确定我违反了一些基本的设计原则。以这种方式提供静态图像是一种好习惯吗?或者我应该将整个图像(而不仅仅是路径)直接添加到数据库中,例如,使用ImageField?这样做的正确方法是什么?
答案 0 :(得分:1)
由于评论ImageField
实际上并未将图像存储在数据库中,因此它会链接到文件系统中的图像,并生成适当的图像网址,以便在模板中使用。
您可以使用rImage = Images.objects.order_by('?')[0]
获取随机图像,但请记住,根据您使用的数据库后端(例如mysql),它可能会很昂贵并且运行速度很慢。然后你可以将图像对象传递给模板并使用{{rImage.image_field.url}}
(图像字段为你处理url生成,只需在项目设置中设置正确的值)