有时候我在阅读Django代码时会看到一些模板中的"load url from future"(从未来加载URL)字样。我不太确定这是什么,但我知道它与URL有关。那么什么时候应该使用"load url from future"呢?
有时候我在阅读Django代码时会看到一些模板中的"load url from future"(从未来加载URL)字样。我不太确定这是什么,但我知道它与URL有关。那么什么时候应该使用"load url from future"呢?
这是由于Django 1.3中 对url
标签进行了更改:
url
和ssi
的更改大多数模板标签都允许您将常量或变量作为参数传递 - 例如:
{% extends "base.html" %}
您可以将一个基础模板指定为常量,但如果您有一个包含值为
base.html
的上下文变量templ
:{% extends templ %}
这也是合法的。
然而,由于历史原因,
url
和ssi
标签是不同的。这些标签使用第二种无引号语法,但将参数解释为常量。这意味着无法将上下文变量用作url
和ssi
标签的目标。Django 1.3 标志着纠正这个历史偶然的开始。Django 1.3 添加了一个新的模板库——
future
——提供了url
和ssi
模板标签的备选实现。这个future
库实现了行为,使第一个参数的处理与所有其他变量的处理一致。所以,一个包含以下内容的现有模板:{% url sample %}
应该被替换为:
{% load url from future %} {% url 'sample' %}
实现旧行为的标签已被废弃,在Django 1.5中,旧行为将被新行为所取代。为确保与未来版本的Django兼容,现有模板应修改为使用新的
future
库和语法。
由于以下突出的异常与模板相关,我将在另一个答案中提供:
如果你在django模板(Django版本>1.4)解析器内抛出django.core.urlresolvers.NoReverseMatch
异常,那可能是因为使用了{% load url from future %}
。
在这种情况下,只需引用传递给url标签的url。即{% url someurl %}
应该变成{% url 'someurl' %}
。感谢Ignacio VA指引我朝着这个方向前进。
url from future
已被移除。请参见https://github.com/sehmaschine/django-grappelli/issues/648 - codescribblr