如何为静态文件提供服务';有条件地';在Django

如何为静态文件提供服务';有条件地';在Django,django,apache,mod-wsgi,Django,Apache,Mod Wsgi,我有一个应用程序,其中包括在各自回购协议中维护的模板。以下是目录结构: 正如您所见,每个模板都有自己的静态文件集。我的问题是,如何使用每个模板的相应静态文件来渲染每个模板??我愿意接受任何可以在生产中使用的可行解决方案。我使用apache2和mod_wsgi进行生产,如果需要,我还准备使用dj static 非常感谢您的帮助。您可以注册一个在所有静态文件路径上调用的过滤器,并将模板静态文件路径传递给您的上下文 首先制作一个合适的过滤器: from django.template import

我有一个应用程序,其中包括在各自回购协议中维护的模板。以下是目录结构:

正如您所见,每个模板都有自己的静态文件集。我的问题是,如何使用每个模板的相应静态文件来渲染每个模板??我愿意接受任何可以在生产中使用的可行解决方案。我使用apache2和mod_wsgi进行生产,如果需要,我还准备使用dj static


非常感谢您的帮助。

您可以注册一个在所有静态文件路径上调用的过滤器,并将模板静态文件路径传递给您的上下文

首先制作一个合适的过滤器:

from django.template import Library
from urlparse import urljoin
register = Library()
from django.conf import settings


@register.filter
def make_static(relative_url, template_dir):
    base = urljoin(settings.STATIC_URL, template_dir)
    return urljoin(base, relative_url)
现在,在渲染模板时,添加对模板静态文件的基础位置的引用:

from django.template import Context
from django.template.loader import get_template

template = get_template('template1/index.html')
context = Context({'template_dir': 'template1/'})
template.render(context)
在实际模板中,使用如下过滤器:

<img src="{{'imgs/some_image.jpg'|make_static:template_dir}}">


只有当您的每个模板都继承了使用这些通用路径的某个基本模板,但每个模板都需要不同的图像或其他外观,这才真正有用。

您的生活之所以如此艰难,有什么具体原因吗?一个静态文件夹将更容易维护和查找。speedyGonzales,这不是我的事。这完全不在我的控制范围之内。我必须解决这个问题。谢谢你,knbk。我理解你的方法,这似乎是正确的方法。但是,我得到一个错误“make_static需要1个参数,提供0”,我按如下方式调用筛选器“”。有什么问题吗?嘿,我给过滤器加了一些额外的空格,这会破坏过滤器解析。它现在已经修复。它现在可以工作了,但仍然是指/static/images/some_image.jpg,而不是/static/templates2/images/some_image.jpg中的图像。我错过了什么?啊,我犯了个错误。urljoin的工作原理与我想象的略有不同。在上下文中,您应该放置{'template_dir':'templates2/'}(注意额外的斜杠)。我已经更新了答案。您必须在settings.py中配置您的STATICFILE\u DIRS(您可能希望将您的应用程序/模板/文件夹添加到其中)和STATIC\u ROOT,对于生产,您需要运行python manage.py collectstatic。有关更多信息,请参阅。