如何让django缩图显示我的图像?

时间:2015-10-24 11:07:51

标签: django

Currenlty,我从http://www.lightbird.net/dbe/photo.html学习了django,我遇到了一个问题!我想在'缩略图项'上显示缩略图,但它只显示html代码:

<a href="/photos/1414.jpg><img border="0" alt="" src="/photos/1414.jpg" height="40"/></a>

我已经定义了类Image方法,如下所示:

def thumbnail(self):
    return """<a href="/%s><img border="0" alt="" src="/%s" height="40"/> """ % ((self.image.name,self.image.name))

Class Image的属性定义如下:

class Image(Models.Model):
    #The rest of another code
    image=models.ManyToManyField(upload_to="photos/")
    #....another code ..

我检查了我的路径是否在我的项目'myweb / photos /'上创建了照片 我怎样才能让页面理解它的HTML代码。

3 个答案:

答案 0 :(得分:0)

请按照djangoproject.com上的教程进行操作..链接上的代码使用django不正确,关闭它并阅读官方文档

答案 1 :(得分:0)

使用url属性代替图片上的name属性:

def thumbnail(self):
    return """<a href="/%s><img border="0" alt="" src="/%s" height="40"/> """ % ((self.image.url,self.image.url))

还有优秀的工具sorl-thumbnail。它有助于在模板中动态生成缩略图。使用pip install sorl-thumbnail安装它。您可以像这样使用它:

<强> template.html

{% load thumbnail %}
{% thumbnail item.image "100x100" crop="center" as im %}
    <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}

答案 2 :(得分:0)

首先,我不知道你为什么要在这个用例中使用ManyToMany字段。您需要使用ImageField

您定义为ImageField的字段将具有url属性,您可以使用该属性来引用文件的相对路径。

其次,不要在模型类中混合使用HTML和Python。 Django专门针对这个用例进行模板化:

from django.template.loader import render_to_string

class Image(models.Model):
    image = models.ImageField(upload_to='photos')
    alt = models.CharField(max_length=100)

    def thumbnail(self):
        return render_to_string('thumbnail.html', {'image': self})


# thumbnail.html
<img src="{{ image.image.url }}" alt="{{ image.alt }}" ... />

请记住,人为地将全尺寸图像缩放到40x40像素以生成缩略图是非常低效的,如果有很多这样的图像,绝对会压缩性能。

正如其他人所提到的,您可以使用优秀的库,例如django-easy-thumbnailssorl-thumbnail来生成这些图片的正确,缩小,优化版本,无论您需要什么尺寸。

相关问题