Подтвердить что ты не робот

Что такое "URL-адрес загрузки из будущего" в Django

Когда я иногда читаю код django, я вижу в некоторых шаблонах "load url from future". Я не совсем уверен, что это такое, но я знаю, что это имеет какое-то отношение к URL-адресам. Как и когда этот URL-адрес нагрузки из будущего предполагается использовать?

4b9b3361

Ответ 1

Из-за изменение тега url, принятое в версии 1.3:

Изменения в url и ssi

Большинство тегов шаблонов позволят вам передать либо константы, либо переменные в качестве аргументов - например:

{% extends "base.html" %}

позволяет указать базовый шаблон как константу, но если у вас есть переменная контекста templ, которая содержит значение base.html:

{% extends templ %}

также является законным.

Однако из-за аварии истории url и ssi отличаются. Эти теги используют второй, quoteless синтаксис, но интерпретируют аргумент как константу. Это означает, что нельзя использовать переменную контекста в качестве цели тега 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 библиотек и синтаксиса.

Ответ 2

Я поставлю это в отдельный ответ из-за следующего существенного Исключения в связи с шаблонами:

Если вы получаете исключение django.core.urlresolvers.NoReverseMatch, исключенное из парсера django template (Django version > 1.4), это может быть просто использование {% load url from future %} в шаблоне.

В этом случае просто укажите URL-адрес, который передается в url-tag. То есть {% url someurl %} должно стать {% url 'someurl' %}. Спасибо Ignacio VA за то, что он указал мне в этом направлении.