Django的。的ImageField。 Django中静态文件的路径

时间:2016-01-14 17:40:27

标签: python django django-models

我使用Django 1.9.1,Python 3.5。 代码:

class Image(models.Model):
image = models.ImageField(upload_to = "shop/static/shop")
description = models.CharField(max_length = 200, blank = True)
def __str__(self):
    return self.image.url

def image_tag(self):
    return u'<img src="/%s" width="300"/>' % self.image.url[5:] #Bad code
image_tag.allow_tags = True

创建对象图像后,Image.image.url=shop/static/shop/filename。我可以通过以下地址获取图片:/static/shop/filename。这个例子正在运行,但是

return u'<img src="/%s" width="300"/>' % self.image.url[5:] #Bad code
我认为

self.image.url[5:]是错误的代码。如果STATIC_URL将被更改,则代码将无效。如何更改使用其他STATIC_URL的代码。是否存在库处理URL?

2 个答案:

答案 0 :(得分:9)

STATIC_ROOTSTATIC_URL用于静态文件 - 您的Web应用程序使用的文件,不会被其用户更改,即静态图像(您的站点徽标,背景等)。 如果您使用的是由用户上传的文件,或者是图片,则会使用MEDIA_ROOTMEDIA_URL。 定义upload_to时,它会在您的设置中与MEDIA_ROOT连接。 那就是:

MEDIA_ROOT='/var/www/media/'

你定义:

image = models.ImageField(upload_to = "shop/static/shop")

图像将存储为/var/www/media/shop/static/shop/[image_name.jpg]

MEDIA_URL是URL中与文件系统路径上的MEDIA_ROOT对应的部分。

此外,如果您self.image.url[5:]尝试获取相对路径,则根据您的设置,您可能只使用self.image.path

答案 1 :(得分:4)

谢谢Nikita!它帮助了我。致settings.py我添加了2行:

MEDIA_ROOT = '/home/1234/5/6/django_app/media/'
MEDIA_URL = '/media/'

除此之外我改变了models.py。之前:

class Image(models.Model):
    image = models.ImageField(upload_to = 'some_path')

后:

class Image(models.Model):
    image = models.ImageField()

即。用户上传的图片会自动下载到MEDIA_ROOT路径。

为了使这些图片可用,请提供浏览器,并在urls.py中进行以下更改:

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

urlpatterns = [
    url(r'^admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

之后,图片将在http://server.com/media/filename_of_image中显示。

我的目标是在管理控制台中显示图片。在那些操作之后,models.py中的代码将遵循:

class Image(models.Model):
    image = models.ImageField()
    description = models.CharField(max_length = 200, blank = True)
    def __str__(self):
        return self.image.url

    def image_tag(self):
        return u'<img src="%s" width="300"/>' % self.image.url #Not bad code
    image_tag.allow_tags = True