[英]Django STATIC_URL clarification
我已经阅读了关于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 /'之间的效果
os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))), 'static', 'templates'),
对于每个“ os.path.dirname()”,我在下面还包含一个与父目录相对应的文件,因此在我的示例中,我有四个,它表明根文件夹为当前目录上方的4个文件夹。
上载的文件始终位于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
不同,没有命令来管理媒体文件。 您必须自己处理。
现在设置默认值; 除了路径之外,您还可以添加可调用对象 (函数)的名称,该名称在保存对象实例时被调用。 您可以利用此:
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.