【问题标题】:Setting up site-specific static folders with Django Sites使用 Django Sites 设置特定于站点的静态文件夹
【发布时间】:2021-06-09 07:15:48
【问题描述】:

我正在使用 Django 站点。我希望能够拥有特定于站点的模板和静态文件。

我当前的目录结构是:

├── site_a
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── site_b
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
└── templates
    ├── site_a
    │   ├── _navbar.html
    │   ├── home.html
    │   └── signup.html
    └── site_b
        ├── _navbar.html
        ├── home.html
        └── signup.html

我知道如果我在 INSTALLED_APPS 中将模板声明为应用程序,我可以在 site_x 目录中移动模板。有没有另一种方法告诉 Django 在 site_a/templates 中使用模板而不将 site_a 声明为应用程序?

另外,我还希望有没有放在项目 STATIC_ROOT 中的特定于站点的静态文件,以便我的树实际上看起来像:

.
├── site_a
│   ├── __init__.py
│   ├── settings.py
│   ├── static
│   │   ├── css
│   │   └── js
│   ├── templates
│   │   ├── _navbar.html
│   │   └── home.html
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
└── site_b
    ├── __init__.py
    ├── settings.py
    ├── static
    │   ├── css
    │   └── js
    ├── templates
    │   ├── _navbar.html
    │   └── home.html
    ├── urls.py
    ├── views.py
    └── wsgi.py

【问题讨论】:

    标签: python django django-settings django-3.1


    【解决方案1】:

    您可以通过STATICFILES_DIRS (Django Docs) 设置静态文件无需声明site_a

    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, 'static'),
        ('site_a', os.path.join(BASE_DIR, 'site_a/static')),
        'Full path to your file or directory'
    )
    

    在模板中:

    <script src="{% static 'site_a/js/my_site_a.js' %}" type="text/javascript"></script>
    

    声明您的应用:

    将您的static files(Django Docs) 存储在应用中名为 static 的文件夹中:site_a/static/site_a/example.jpg

    对于模板也一样:site_a/templates/site_a/example.html

    在你的 settings.py 中设置APP_DIRS:

    TEMPLATES = [
        {
            ...,
            'APP_DIRS': True,
            ...
        },
    ]
    

    Support for template enginesOverriding templates

    APP_DIRS 告诉引擎是否应该在已安装的应用程序中查找模板。每个后端定义一个常规名称 应用程序内的子目录,其模板应该在其中 存储。

    【讨论】:

    • 没有必要在 STATICFILES_DIRS 中包含 STATIC_ROOT(我猜这就是你所说的os.path.join(BASE_DIR, 'static'))。
    • @IvanStarostin,这只是一个例子,它可以是任何东西。 os.path.join (BASE_DIR, 'static') 是基本静态目录,对于其他静态目录,您必须设置附加文件目录的完整路径,例如 ..
    • 我知道我可以在 INSTALLED_APPS 中将每个新站点注册为应用程序。这是实现这一目标的唯一方法吗?我想知道如果我想使用 SITE_ID 支持 100 个站点,但又不想向 INSTALLED_APPS 添加 100 个条目,那么这将如何扩展。
    • @Vishal,您可以添加任何静态文件而无需注册,也就是说您不需要在 INSTALLED_APPS 中添加它。使用STATICFILES_DIRS
    • @Vishal,我以 site_a 为例,说明您也可以为其他目录添加前缀。
    猜你喜欢
    • 2021-07-30
    • 2019-09-27
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2014-06-02
    • 2020-06-19
    相关资源
    最近更新 更多