Django STATIC_URL澄清

时间:2014-03-22 13:33:04

标签: python django static django-staticfiles

我已经阅读了有关stackoverflow和django网站的其他主题,但我仍感到困惑。

这些是我的配置:

STATIC_ROOT = os.path.join(BASE_DIR, 'assets')
STATIC_URL = '/static/'

当我运行manage.py collectstatic时,我的静态文件将在myproject/assests/

收集

我将在此处存储默认个人资料照片(用于我的模型):myporject/static/images/default_profile_photo.png,因此当我运行收集静态时,它将在myproject/assets/images/default_profile_photo.png

中进行加密

到目前为止一切都很好。

在我的 models.py 上,我有一个字段:

class UserProfile(models.Model):
    photo = models.ImageField(upload_to = get_upload_file_name,
                              storage = OverwriteStorage(),
                              default = 'path/to/my/default/image.jpg'))

我的主要问题是:我应该将哪条路径设置为此默认属性?我应该以某种方式从STATIC_URL中受益吗?

其他问题:我如何在这里使用settings.py中的STATIC_URL?什么是STATIC_URL的用法?我在哪里以及如何看到使用STATIC_URL =' / static /'之间的效果?和STATIC_URL =' / wtf /'

2 个答案:

答案 0 :(得分:0)

   os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))), 'static', 'templates'),

对于每个“os.path.dirname()”我在下面还有一个,它对应一个父目录,所以在我的例子中我有四个,它将根文件夹澄清为4个文件夹,高于当前目录。

答案 1 :(得分:0)

上传的文件始终位于MEDIA_ROOT的子目录中,并从MEDIA_URL引用。

对于任何FileField(例如ImageField),您只需提供子目录,该子目录将用于存储上传到此模型的文件。

如果MEDIA_ROOT'/foo/bar/uploads/',那么在你的模特中你就拥有了这个:

class Foo(models.Model):
    photo = models.ImageField(upload_to='photos')

然后,所有上传的照片都会存储在/foo/bar/uploads/photos/

collectstatic不同,没有管理媒体文件的命令。你必须自己处理它们。

现在设置默认值;除了路径之外,您还可以添加 callable (函数)的名称,只要保存对象的实例,就会调用该名称。你可以利用这个:

import os

from django.contrib.staticfiles import finders
from django.config import settings


def get_default_photo_path():
   results = finders.find('/default/image.jpg')
   if results:
       return os.path.join(settings.STATICFILES_DIRS[0], results[0])

class Foo(models.Model):

    photo = models.ImageField(upload_to='photos',
                              default=get_default_photo_path, null=True)

现在,无论何时创建新对象,默认值都是/default/image.jpg的静态文件路径。如果由于某种原因该文件不存在(例如,您忘记添加它),将返回None。在其他存储中,您必须设置null=True