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>