我使用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?
答案 0 :(得分:9)
STATIC_ROOT
和STATIC_URL
用于静态文件 - 您的Web应用程序使用的文件,不会被其用户更改,即静态图像(您的站点徽标,背景等)。
如果您使用的是由用户上传的文件,或者是图片,则会使用MEDIA_ROOT
和MEDIA_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