Django release 1.5: 'url' требует непустого первого аргумента. Синтаксис изменился в Django 1.5


Я начал использовать Django release 1.5 и получил проблему с моим старым кодом:

<a href="{% url auto.views.viewpost post.slug %}"><h3>{{post.title}}</h3></a>

Ошибка: 'url' требует непустого первого аргумента. Синтаксис изменен в Django 1.5, см. документы. Документы:

Одна устаревшая функция, заслуживающая внимания, - это переход на url-адрес" нового стиля". метка. До Джанго 1.3, синтаксиса {% URL-адрес объекта myview %} интерпретируется неверно (Джанго считал" myview " буквальным именем a view, а не переменная шаблона с именем myview). Джанго 1.3 и выше ввел синтаксис {% load url from future %} для приведения исправленное поведение, в котором myview рассматривался как переменная.

Результатом этого является то, что если вы не используете {%load url from будущее %} в ваших шаблонах вам нужно будет изменить теги, такие как {%url myview %} to {%url "myview"%}. Если вы использовали {%load url from future %} вы можете просто удалить эту строку под Django 1.5

Тогда я попробовал: <a href=“{% url ‘auto.views.view_post’ post.slug %}”><h3>{{post.title}}</h3></a> но получил ошибку обратного хода для ‘авто.Просмотры.view_post 'with arguments ‘ ( ’ ,)' and keyword arguments '{} ' not found. :( Что я делаю не так? Спасибо!

6 66
url

6 ответов:

Я действительно ненавижу делать все это вручную, поэтому я написал сценарий sed, чтобы сделать это за меня. Сначала убедитесь, что у вас есть резервная копия, а затем запустите ее в каталоге шаблонов:

find . -type f -print0 | xargs -0 sed -i 's/{% url \([^" >][^ >]*\)/{% url "\1"/g'

Он пройдет через все файлы шаблона и заменит это:

{% url something.else foo bar %}

С этим

{% url "something.else" foo bar %}
Будьте осторожны, я был немного ленив с этим, он может сломаться на некоторых конструкциях. Однако все равно будет легче искать ошибки в диффе, чем делать это вручную.

Во-первых, вы правильно использовали одинарные кавычки для имени представления, т. е. 'auto.views.view_post'.

Теперь временно удалите тег url и проверьте, что {{ post }} и {{ post.slug }} дают вам ожидаемые значения. Сообщение об ошибке arguments '('',)' предполагает, что проблема заключается в post.slug.

Исключить папку из .git и чтобы избежать ошибок MacOS добавили пустые кавычки в option-i". Пример:

find . -path '*/.git*' -prune -o -type f -print0 | xargs -0 sed -i '' 's/ url \([^" >][^ >]*\)/ url "\1"/g'

Но мне нравится такой подход (MacOS):

grep '{% url' -lrZ . | xargs -0 sed -i '' 's/ url \([^" >][^ >]*\)/ url "\1"/g'

Если вы используете Mac OS, вам нужно будет передать-e

find . -type f -print0 | xargs -0 sed -i -e 's/ url \([^" >][^ >]*\)/ url "\1"/g'

Я получал ошибку "незаконная последовательность байтов" от sed с большинством из этих рецептов, которые я смог исправить, сделав это первым:

LANG=C
Тем не менее, эти рецепты породили тонны ложных срабатываний в моем проекте, и у нас уже была смесь имен url, которые были в одинарных кавычках, двойных кавычках или без кавычек. Это был настоящий бардак. Оказалось, что самый чистый подход состоял в том, чтобы просто искать каталог шаблонов с помощью моего редактора (Sublime) в режиме регулярных выражений для:
\{\%\ url\ [^']
\{\%\ url\ [^"]

(найти все экземпляры, которые не были уже процитированы) и пройдите их визуально. Это оказалось быстрее и чище, чем пытаться автоматизировать его, а затем очистить беспорядок после этого.

Вам также может потребоваться выполнить регулярное выражение-заменить "\{% url "([\w:]+)" на "\{% url '$1', чтобы избежать синтаксических ошибок типа <a href="{% url "foo:bar" %}">baz</a>