【问题标题】:Django Template being rendered differently for different urlsDjango 模板针对不同的 url 呈现不同的方式
【发布时间】:2012-07-06 21:46:38
【问题描述】:

我在我的一个模板中使用了 STATIC_URL,如果我使用一个 url,它可以正常工作,如果我使用另一个,它会失败。在这两种情况下,使用完全相同的模板运行完全相同的视图。

模板代码:

<link href="{{ STATIC_URL }}css/form.css" type="text/css" rel="stylesheet" />
<!-- rest of page... -->

查看代码:

def myform(request):
    if request.method == 'POST':
        form = MyForm(request.POST, request.FILES)
        obj = save_form(form)
        if obj:
            send_confirmation_email(obj)
            return redirect('done-page')
    else:
        form = MyForm()

    return render(request, 'template.html', {'form': form,})

网址

# site urls.py
urlpatterns = patterns('',
    url(r'^$', 'site.app.views.myform'),
    url(r'^app/', include('site.app.urls'),
    #...
)

# app urls.py
urlpatterns('site.app.views',
    url(r'^$', 'myform'),
    #...
)

以上是我的 django 网站的 sn-p。如果通过“mydomain.com/”(站点的索引)访问该页面,则正确呈现 STATIC_URL 并正确链接 css 文件。如果通过“mydomain.com/app/”(应用程序的索引)访问页面,则 STATIC_URL 变为空白,因此没有 css,但页面的其余部分可以正常呈现。

我的印象是,如果视图和模板相同,则 url 应该是无关紧要的。我错过了什么吗?无论使用什么 url,我必须更改什么才能让 STATIC_URL 正确呈现?

【问题讨论】:

  • 两个文件的源输出完整路径是什么?一个是/static/css/form.css,另一个是css/form.css?
  • 是的,就是输出。在根目录下,我得到“/static/css/form.css”,在 app/ 中得到“css/form.css”
  • 您是否尝试过 Django 调试工具栏,以帮助推断发生了什么?根据您提供的信息,我认为这不应该发生-也许有一些外部因素?无论如何,这很有趣,如果你明天还没有找到任何东西,我会设置一个测试用例

标签: django templates


【解决方案1】:

我很难相信STATIC_URL“变成空白”。除非从STATIC_URL 字面上没有价值的时候缓存了有问题的视图响应,否则没有合理的理由。如果您正在使用视图或模板缓存,请确保您删除缓存,或类似的重新启动 memcached(或其他)。如果您正在开发并使用runserver,请重新启动runserver。

根据它何时起作用和不起作用的另一个更可能的情况是,您的STATIC_URL 没有以/ 为前缀,即它只是static/。这将使主页上的 CSS 文件 /static/css/forms.css 的链接(应该如此),但在另一页上它将是 /app/static/css/forms.css,这显然是不正确的。

【讨论】:

  • 我相信克里斯在他的第二段中已经把它钉在了头上。在浏览器的两个 url 上查看源代码,并查看为该 css 文件输出的 url。
  • 不幸的是,情况是前者。 STATIC_URL 在应用程序 url 中似乎是空的。来自 html 的来源如下:从 'mydomain.com/',我得到:&lt;link href="/static/app/css/form.css" type="text/css" rel="stylesheet" /&gt; 而从 'mydomain.com/app/',我得到:&lt;link href="app/css/form.css" type="text/css" rel="stylesheet" /&gt; 其中我的 STATIC_URL 设置为 '/static/ '。
【解决方案2】:

只是在这里猜测,但这可能是因为您没有在视图中传递ContextObject。所以要解决这个问题,你可以这样做:

from django.template import RequestContext

...

def myform(request):
    ...

    return render(request, 'template.html', {'form': form,}, context_instance=RequestContext(request))

否则STATIC_URL 变量将不会传递给模板,并且是空白的,如您所述。我还假设您已经在 Context Processors 设置中有这个:

django.core.context_processors.static

【讨论】:

  • render 快捷方式自动使用 RequestContext。 render_to_request 是需要显式设置的版本。是的,静态处理器包含在TEMPLATE_CONTEXT_PROCESSORS
  • 啊,你是对的,它在文档中说得对,我的错。嗯,还能是什么……
【解决方案3】:

我发现了错误。发生奇怪的行为是因为这是以前构建的 django 站点的副本。我忽略了 app/urls.py 中 urlpatterns 的第一个参数,导致代码指向旧版本。不幸的是,该代码位于同一个盒子上并且位于 python 路径上。因此,这个错误并没有导致异常,而是阴险地做了一些我没有预料到的事情。

实际情况是这样的:

# site_copy urls.py
urlpatterns = patterns('',
    url(r'^$', 'site_copy.app.views.myform'),
    url(r'^app/', include('site_copy.app.urls'),
    #...
)

# site_copy/app urls.py
urlpatterns('site.app.views',
    url(r'^$', 'myform'),
    #...
)

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2013-06-13
    相关资源
    最近更新 更多