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

iva*_*van 3 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
Run Code Online (Sandbox Code Playgroud)

然后创建对象Image Image.image.url=shop/static/shop/filename.我可以通过以下地址获取图像:/static/shop/filename.这个例子很有效

return u'<img src="/%s" width="300"/>' % self.image.url[5:] #Bad code
Run Code Online (Sandbox Code Playgroud)

self.image.url[5:]我认为是糟糕的代码.如果STATIC_URL将被更改,则代码将不起作用.如何更改与其他人合作的代码STATIC_URL.是否存在库处理URL?

Nik*_*ita 9

STATIC_ROOTSTATIC_URL对于静态文件-这是使用Web应用程序,不被它的用户更改文件,即静态图像(你的网站标识,背景等).如果您使用的是用户上传的文件,图片与否,MEDIA_ROOT以及MEDIA_URL是否使用过的文件.定义时,upload_to它会MEDIA_ROOT在您的设置中连接.所以ie:

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.


iva*_*van 6

谢谢尼基塔!它帮助了我。要settings.py我加了2行:

MEDIA_ROOT = '/home/1234/5/6/django_app/media/'
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)

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

class Image(models.Model):
    image = models.ImageField(upload_to = 'some_path')
Run Code Online (Sandbox Code Playgroud)

后:

class Image(models.Model):
    image = models.ImageField()
Run Code Online (Sandbox Code Playgroud)

即用户上传的图像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)
Run Code Online (Sandbox Code Playgroud)

之后,图像将在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
Run Code Online (Sandbox Code Playgroud)