【问题标题】:Django STATIC_URL clarificationDjango STATIC_URL 说明
【发布时间】:2014-03-22 13:33:03
【问题描述】:

我已经阅读了关于 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/' 之间的效果

【问题讨论】:

    标签: python django static django-staticfiles


    【解决方案1】:
       os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))), 'static', 'templates'),
    

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

    【讨论】:

    • 如你所说,这就是我的情况: return os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(文件)))、“资产”、“图像”、“generic_profile_photo.png”)。我仍在对“资产”一词进行硬编码。此外,我的默认图像没有加载。当我尝试从数据库中拍照时,我收到“用户配置文件匹配查询不存在”:source_file = UserProfile.objects.get(user = request.user).photo
    【解决方案2】:

    上传的文件始终位于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

    【讨论】:

    • 尝试执行 manage.py runserver 时出现错误:连接路径 (C:\images\default_profile_photo.png) 位于基本路径组件之外。我正在做 results = finders.find('/images/default_profile_photo.png') 。并且假设这个结果将有 2 个元素(因为它找到 /assets/images 下的图像,以及 /static/images 下的那个)
    • find 将返回它找到的第一个,但您必须将路径附加到找到文件的STATICIFILE_DIRS 目录。我更新了示例,以展示如何在 STATICFILE_DIRS 元组中附加第一项以返回完整路径。
    • 仍然无法正常工作。有绝对路径吗?因为如果是这样,我做了 default = os.path.join(settings.STATIC_ROOT,'images','generic_profile_photo.png')
    猜你喜欢
    • 2012-09-03
    • 2012-01-21
    • 2012-07-25
    • 1970-01-01
    • 2012-09-23
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多