django - 在基础项目中声明的变量不会出现在app中

时间:2010-05-30 00:10:35

标签: python django pinax

我有一个名为STATIC_URL的变量,在我的基础项目的settings.py中声明:

STATIC_URL = '/site_media/static/'

例如,在我的site_base.html中使用它,它链接到CSS文件,如下所示:

<link rel="stylesheet" href="{{ STATIC_URL }}css/site_tabs.css" />

我有一些与不同应用相关的模板,这些模板扩展了site_base.html,当我在浏览器中查看它们时,CSS正确链接为

<link rel="stylesheet" href="/site_media/static/css/site_tabs.css" />

(这些带有默认的pinax发行版。)我创建了一个名为“courses”的新应用程序,它位于..... / apps / courses文件夹中。我有一个名为courseinstance.html的课程页面的视图,它扩展了site_base.html,就像其他的一样。

然而,当这个在我的浏览器中呈现时,它出现为

<link rel="stylesheet" href="css/site_tabs.css" />

好像STATIC_URL等于此应用的“”。我是否必须做出某种声明才能让我的应用程序采用与项目相同的变量值?我没有应用程序的settings.py文件。顺便说一句,该应用程序列在我的INSTALLED_APPS列表中,它可以很好地提供,只是没有链接到CSS文件(所以页面看起来很有趣)。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

settings.py中的变量不可用于模板。模板可用的内容由呈现它的视图决定。渲染模板时,您传入一个字典,该字典是模板的“上下文”。上下文是变量名称及其值的字典。

要将设置中的值传递到模板上,通常需要执行以下操作:

from django.conf import settings
def my_view(request):
    # view logic
    context = {
            'STATIC_URL': settings.STATIC_URL,
            # other template variables here
    }
    # render the template and produce a response

您的STATIC_URL设置似乎与MEDIA_URL setting非常相似。

MEDIA_URL通过default context processor提供给所有模板。你可以通过writing your own context processor做类似的事情。您可以查看django源中的how the default context processors are implemented以获得一个想法。

答案 1 :(得分:0)

def courseinstance(request, courseinstance_id):
    p = get_object_or_404(CourseInstance, pk=courseinstance_id)
    return render_to_response('courses/courseinstance.html', {'courseinstance': p},
        context_instance=RequestContext(request)) #added this part to fix problem