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

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

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

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

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

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

Затем я попробовал:  <a href="{% url ‘auto.views.view_post’ post.slug %}"><h3>{{post.title}}</h3></a> но получил ошибку Reverse для 'auto.views.view_post с аргументами' (',)' и аргументы ключевого слова '{} не найден.:( Что я делаю не так? спасибо!

Ответ 1

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

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

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

{% url something.else foo bar %}

с этим

{% url "something.else" foo bar %}

Будьте осторожны, я был немного ленив в этом, он может сломаться на некоторых конструкциях. Тем не менее, будет легче искать ошибки в diff, чем делать это вручную.

Ответ 2

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

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

Ответ 3

Чтобы исключить папку .git и избежать ошибки, MacOS добавила пустые кавычки в параметр -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'

Ответ 4

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

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

Ответ 5

Я получал ошибку "НЕЗАКОННАЯ БАЙТА ПОСЛЕДОВАТЕЛЬНОСТЬ" от sed с большинством этих рецептов, которые я смог исправить, сделав это в первую очередь:

LANG=C

Однако эти рецепты генерировали массу ложных срабатываний в моем проекте, и у нас уже было сочетание имен URL-адресов, которые были одинарными, двойными кавычками или некорректными. Это был беспорядок. Самый чистый подход заключался в том, чтобы просто искать каталог шаблонов с моим редактором (Sublime) в режиме регулярного выражения для:

\{\%\ url\ [^']
\{\%\ url\ [^"]

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

Ответ 6

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