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