在Django中,“load url from future”是什么意思?

20

有时候我在阅读Django代码时会看到一些模板中的"load url from future"(从未来加载URL)字样。我不太确定这是什么,但我知道它与URL有关。那么什么时候应该使用"load url from future"呢?


我还希望在这些答案中看到的是 - 这个标签将在未来什么时候消失?Django 1.4是一个LTS版本,也许1.8会是另一个LTS版本(尽管Django项目没有承诺)。那么我什么时候需要再次查看我的应用程序,并删除这个future import呢? - Tomasz Gandor
在Django 1.9中,url from future已被移除。请参见https://github.com/sehmaschine/django-grappelli/issues/648 - codescribblr
2个回答

10

这是由于Django 1.3中 url标签进行了更改

 

urlssi的更改

    

大多数模板标签都允许您将常量或变量作为参数传递 - 例如:

{% extends "base.html" %}

您可以将一个基础模板指定为常量,但如果您有一个包含值为base.html的上下文变量templ

{% extends templ %}

这也是合法的。

然而,由于历史原因,urlssi标签是不同的。这些标签使用第二种无引号语法,但将参数解释为常量。这意味着无法将上下文变量用作urlssi标签的目标。

Django 1.3 标志着纠正这个历史偶然的开始。Django 1.3 添加了一个新的模板库——future——提供了urlssi模板标签的备选实现。这个future库实现了行为,使第一个参数的处理与所有其他变量的处理一致。所以,一个包含以下内容的现有模板:

{% url sample %}

应该被替换为:

{% load url from future %}
{% url 'sample' %}

实现旧行为的标签已被废弃,在Django 1.5中,旧行为将被新行为所取代。为确保与未来版本的Django兼容,现有模板应修改为使用新的future库和语法。


@lakesh 在我对一个相关问题的回答中有解释。 - meshy
3
“ahhh”这个词的意思是“加载Django 1.5版本的url标签实现”。我一直以为代码里面有什么疯狂的n次装饰器函数懒加载类型的东西。不知怎么地,模板居然能够加载一个尚不存在的URL???这让我很困惑……我太害怕看代码了。 - Michael Bylstra

5

由于以下突出的异常与模板相关,我将在另一个答案中提供:

如果你在django模板(Django版本>1.4)解析器内抛出django.core.urlresolvers.NoReverseMatch异常,那可能是因为使用了{% load url from future %}

在这种情况下,只需引用传递给url标签的url。即{% url someurl %}应该变成{% url 'someurl' %}。感谢Ignacio VA指引我朝着这个方向前进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接