Перенос тегов URL в django 1.5

Я пытаюсь перенести старое приложение django на django 1.5. В разных html-файлах есть 745 URL-адресов следующим образом:

{% url url_name %}

Если я не ошибаюсь, это устарело и больше не может использоваться с django 1.5 (как сказано здесь), и я должен преобразовать их все в:

{% url 'url_name' %}

Любая идея сделать это, не сойдя с ума? Может быть, какой-то скрипт, я не знаю... Я не могу представить, как это сделать с заменой в пути.

Я, наверное, упускаю что-то очевидное.


person kastillo    schedule 27.11.2012    source источник


Ответы (2)


ПРИМЕЧАНИЕ. Эта команда является деструктивной. Используйте контроль версий или создайте резервную копию каталога шаблонов перед его запуском.

Вы можете использовать сед. Из каталога (или каталогов) вашего шаблона запустите

sed -i -r -e "s#\{% url ([a-zA-Z0-9_.:-]+)#\{% url '\1'#g" *

Выражение соответствует {% url [view name], поэтому аргументы, указанные в теге шаблона URL, останутся неизменными.

Чтобы запустить его рекурсивно,

find . -type f -print0 | xargs -0 sed -i -r -e "s#\{% url ([a-zA-Z0-9_.:-]+)#\{% url '\1'#g"

Эта команда sed предполагает, что имена ваших представлений содержат только буквы, цифры, двоеточия, тире, точки и символы подчеркивания — никаких других специальных символов. Теперь поддерживает представления в пространстве имен.

Проверено на соответствие тегам в этом теге Gist шаблона URL-адреса Django 1.4

person Enrico    schedule 27.11.2012
comment
Кажется, я не могу заставить это работать. Он коснулся всех файлов, но не внес никаких изменений. Есть идеи? - person Ben Kilah; 05.03.2013
comment
Редактирование Оли изменилось * на +, что требует флага -r для расширенного регулярного выражения (по крайней мере, на моем компьютере). Я обновил ответ выше. - person Enrico; 06.03.2013
comment
это не работает, оно превратит {% url app:name %} в {% url 'app':name %}. Исправлено: [a-zA-Z0-9_.:-] - person leplatrem; 21.05.2013
comment
@leplatrem, исправлено. Спасибо. - person Enrico; 22.05.2013
comment
@dtc ... хорошо ... вам нужно быть более конкретным. Выводит ли find . -type f список всех файлов шаблонов в папке и подпапках, из которых вы его запускаете? Все ли теги вашего шаблона соответствуют тем же шаблонам, что и теги в связанной сущности? - person Enrico; 04.07.2013
comment
В MacOS синтаксис FreeBSD sed отличается. Замените -r на -E, а -i требует аргумента-суффикса, который может быть пустой строкой, например. sed -i '' -E -e ... - person DrMeers; 15.05.2015
comment
Может быть лучше использовать что-то вроде {%\s+url\s+, так как {%url login %} все еще допустимо, но эта команда его пропустит. [где \s — это пробел, а + — «один или несколько»] Хотя, по-видимому, некоторые sed не поддерживают \s. - person Tim Tisdall; 10.06.2016