我已经阅读了有关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 /'
答案 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
。