Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Django_-_podrobnoe_rukovodstvo

.pdf
Скачиваний:
373
Добавлен:
01.03.2016
Размер:
5 Мб
Скачать
☆

510

Приложение E. Встроенные шаблонные­ теги и фильтры

Отметим, что если фильтр urlize применяется к тексту, который уже содержит HTML-разметку, то результат получается неожиданным. Поэто-

му применяйте его только к обычному тексту. Например:

{{ value|urlize }}

Если value равно “Обратите внимание на www.djangoproject.com”, то будет выведено “Обратите внимание на <a href=”http://www.djangoproject.com”>www. djangoproject.com</a>”.

urlizetrunc

Преобразует адреса URL в гиперссылки, обрезая URL, содержащие больше указанного числа символов. Как и urlize, этот фильтр следует применять только к обычному тексту.

Аргумент: количество оставляемых в URL символов. Например:

{{ value|urlizetrunc:15 }}

Если value равно “Обратите внимание на www.djangoproject.com”, то будет выведено “Обратите внимание на <a href=”http://www.djangoproject.com”>www. djangop...</a>”.

wordcount

Возвращает количество слов.

wordwrap

Разбивает строку по границам слов, оставляя в каждой строчке не более заданного количества символов.

Аргумент: количество символов до переноса на следующую строку. Например:

{{ value|wordwrap:5 }}

Если value равно Joel is a slug, то будет выведено:

Joel is a slug

yesno

Получая строки, которые в логическом контексте отображаются в значения True, False и (необязательно) None, возвращает ту из строк, которая соответствует логическому значению на входе (табл. E.7).

Справочник по встроенным фильтрам

511

Таблица E.7. Примеры фильтра yesno

 

Значение

 

Аргумент

 

Выводится

 

 

 

 

 

 

 

 

 

 

 

True

 

“yeah,no,maybe”

 

yeah

 

False

 

“yeah,no,maybe”

 

no

 

None

 

“yeah,no,maybe”

 

maybe

 

None

 

“yeah,no”

 

“no” (преобразует None в False,

 

 

 

 

 

если соответствие для None не задано)

 

 

 

 

 

 

 

F

Утилита django-admin

Утилита командной строки django-admin.py предназначена для решения административных задач. В этом приложении ее функции рассматриваются более подробно.

Обычно мы обращаемся к django-admin.py с помощью сценария-обертки manage.py, который автоматически создается в любом проекте Django. Перед тем как передать управление django-admin.py, этот сценарий выполняет следующие действия:

•• Добавляет пакет проекта в путь sys.path.

•• Записывает в переменную окружения DJANGO_SETTINGS_MODULE путь к файлу settings.py с параметрами данного проекта.

Сценарий django-admin.py должен находиться в системном­ пути поиска файлов, если установка Django выполнялась с помощью входящей в дистрибутив утилиты setup.py. Если же он отсутствует в пути, то поищите его в подкаталоге site-packages/django/bin, расположенном в каталоге установки Python. Имеет смысл создать символическую ссылку на этот файл из какого-нибудь каталога, включенного в путь, например

/usr/local/bin.

На платформе Windows символических ссылок нет, поэтому просто скопируйте файл django-admin.py в каталог, уже включенный в путь, или измените переменную среды PATH (Пуск → Панель управления → Система → Дополнительно → Переменные среды), включив в список каталогов тот, где находится этот файл.

При работе над единственным проектом Django удобнее использовать сценарий manage.py. Но если часто приходится переключаться с одного файла параметров Django на другой, тогда вызывайте непосредственно django-admin.py, установив предварительно переменную DJANGO_SETTINGS_ MODULE или передав параметр --settings в командной строке.

Порядок вызова

513

В примерах ниже для единообразия мы будем использовать django-admin. py, но manage.py ничем не хуже.

Порядок вызова

Сценарий django-admin.py вызывается следующим образом:

django-admin.py <subcommand> [options] manage.py <subcommand> [options]

Здесь subcommand – одна из подкоманд, перечисленных в разделе «Подкоманды» ниже, а options – список необязательных параметров выбранной подкоманды.

Получение справки

Чтобы вывести список всех имеющихся подкоманд, выполните команду django-admin.py help. Чтобы получить описание одной подкоманды и перечень ее параметров, выполните команду django-admin.py help <subcommand>.

Имена приложений

Многие подкоманды принимают в качестве параметра список имен приложений. Имя приложения – это базовое имя пакета, содержащего ваши модели. Например, если параметр INSTALLED_APPS содержит строку ‘mysite.blog’, то имя соответствующего приложения – blog.

Определение номера версии

Чтобы узнать номер установленной версии Django, выполните команду django-admin.py –-version. Вот как может выглядеть ее результат:

1.1

1.0

0.96

0.97-pre-SVN-6069

Вывод отладочной информации

С помощью параметра --verbosity можно повысить детальность предупредительной и отладочной информации, выводимой на консоль.

Подкоманды cleanup

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

514

Приложение F. Утилита django-admin

compilemessages

Эта подкоманда компилирует po-файлы, созданные подкомандой makemessages, в mo-файлы, необходимые для работы встроенного механизма перевода gettext. См. главу 19.

Параметр --locale

Параметр --locale, или –l определяет подлежащую обработке локаль. Если он не указан, то обрабатываются все локали. Например:

django-admin.py compilemessages --locale=br_PT

createcachetable

Эта подкоманда создает таблицу с указанным именем для хранения кэша в случае, если для кэширования используется база данных. См. главу 15. Например:

django-admin.py createcachetable my_cache_table

createsuperuser

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

При запуске в интерактивном режиме команда предложит ввести пароль нового суперпользователя. При запуске в неинтерактивном режиме пароль не устанавливается, поэтому суперпользователь не сможет войти в систему,­ пока пароль не будет установлен вручную.

Имя пользователя и адрес электронной почты для новой учетной записи можно указать в командной строке с помощью параметров –-username и --email. Если хотя бы один из них не задан и команда createsuperuser запущена в интерактивном режиме, то она предложит ввести недостающую информацию.

Эта команда доступна, только если установлена система­ аутентификации Django (в параметре INSTALLED_APPS присутствует строка django. contrib.auth). См. главу 14.

dbshell

Запускает командный клиент для СУБД, указанной в параметре DATABASE_ENGINE с параметрами соединения, указанными в параметрах

DATABASE_USER, DATABASE_PASSWORD и прочих.

•• Для PostgreSQL запускается программа psql.

•• Для MySQL запускается программа mysql.

Подкоманды

515

•• Для SQLite запускается программа sqlite3.

Предполагается, что необходимая программа находится в одном из каталогов, перечисленных в переменной окружения PATH, и поэтому при вызове ее просто по имени (psql, mysql, sqlite3) она будет найдена и запущена. Не существует способа указать путь к ней вручную.

diffsettings

Выводит различия между текущими параметрами и параметрами Django по умолчанию. Параметры, отсутствующие в списке параметров по умолчанию, помечаются маркером «###». Например, если среди параметров по умолчанию нет ROOT_URLCONF, то в списке, выведенном командой diffsettings, после этого параметра появится «###».

На случай, если вам интересно ознакомиться с полным списком параметров по умолчанию, отметим, что они находятся в файле django/conf/ global_settings.py.

dumpdata

Выводит на стандартный вывод все данные в базе, ассоциированные с указанными приложениями. Если имя приложения не задано, выводятся данные, относящиеся ко всем приложениям. Выход команды dumpdata можно подать на вход loaddata.

Отметим, что для выборки записей dumpdata вызывает подразумеваемый по умолчанию менеджер модели. Если в качестве менеджера по умолчанию вы используете свой собственный класс, который отфильтровывает часть записей, то будут выведены не все объекты.

Например:

django-admin.py dumpdata books

Параметр --exclude исключает указанное приложение из числа тех, чье содержимое будет выведено. Например, чтобы исключить приложение auth, нужно выполнить такую команду:

django-admin.py dumpdata --exclude=auth

Чтобы исключить несколько приложений, задайте параметр --exclude несколько раз:

django-admin.py dumpdata --exclude=auth --exclude=contenttypes

По умолчанию dumpdata выводит данные в формате JSON, но параметр --format позволяет указать другой формат. Актуальный перечень поддерживаемых форматов приведен в документации по Django.

По умолчанию dumpdata выводит все данные в одну строку. Для человека это неудобно, поэтому можно задать флаг --indent, который красиво отформатирует вывод, добавив отступы.

516

Приложение F. Утилита django-admin

Помимо имен приложений, можно указать еще и перечень отдельных моделей в виде appname.Model. Если при вызове dumpdata указано имя модели, то будут выводиться данные не для всего приложения, а только для этой модели. В одной команде можно употреблять одновременно имена моделей и имена приложений.

flush

Возвращает базу данных в состояние, в котором она находилась сразу после выполнения команды syncdb. Это означает, что из базы удаляются все данные, повторно выполняются обработчики, вызываемые после синхронизации, и заново устанавливается фикстура initial_data.

Чтобы команда не задавала никаких вопросов типа «Вы уверены?», укажите параметр noinput. Это полезно, когда django-admin.py запускается в составе автоматизированного сценария, без сопровождения.

inspectdb

Анализирует таблицы в базе данных, на которую указывает параметр DATABASE_NAME, и выводит на стандартный вывод текст модуля с описаниями моделей (файл models.py).

Полезна, когда имеется унаследованная база данных, которую хотелось бы использовать в проекте на основе Django. Эта команда создает модель для каждой обнаруженной в базе данных таблицы.

Естественно, в созданных моделях будут присутствовать атрибуты для всех полей таблицы. Отметим, что при назначении типов и имен полей inspectdb выделяет несколько особых случаев:

•• Если inspectdb не может отобразить тип столбца в тип поля модели, то назначает полю тип TextField и оставляет рядом с ним комментарий ‘This field type is a guess.’ (Это лишь предположение).

•• Если имя столбца в базе данных является зарезервированным словом языка Python (например, ‘pass’, ‘class’ или ‘for’), то inspectdb добавит к имени поля суффикс ‘_field’. Например, если в таблице имеется столбец ‘for’, то в сгенерированной модели появится поле

‘for_field’ с атрибутом db_column=’for’. Рядом с таким полем inspectdb оставит комментарий ‘Field renamed because it was a Python reserved word.’ (Поле переименовано, так как его имя является зарезервированным словом Python).

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

Подкоманды

517

Для СУБД PostgreSQL, MySQL и SQLite inspectdb автоматически определяет первичные ключи и в нужных местах добавляет атрибут primary_ key=True. Внешние ключи распознаются только для PostgreSQL и некоторых типов таблиц в MySQL.

loaddata <фикстура фикстура ...>

Эта подкоманда ищет указанную фикстуру и загружает ее содержимое в базу данных.

Что такое фикстура?

Фикстурой называют набор файлов с сериализованным содержимым базы данных. У каждой фикстуры имеется уникальное имя, а составляющие ее файлы могут быть распределены по нескольким каталогам и нескольким приложениям.

Django ищет фикстуры в следующих местах:

•• В каталоге fixtures каждого из установленных приложений.

•• Во всех каталогах, перечисленных в параметре FIXTURE_DIRS.

•• В каталоге, имя которого буквально совпадает с именем фикстуры, указанном в параметре командной строки.

Загружаются все фикстуры с указанными в подкоманде именами, найденные в любом из перечисленных выше мест.

Если для фикстуры указано не только имя, но и расширение файла, то загружаются только фикстуры заданного типа. Например, команда

django-admin.py loaddata mydata.json

загрузит только JSON-фикстуры с именем mydata. Расширение фикстуры должно соответствовать зарегистрированному имени сериализатора (например, json или xml). Дополнительные сведения о сериализаторах см. в документации по Django.

Если расширение опущено, то Django будет искать фикстуры всех типов с указанными именами. Например, команда

django-admin.py loaddata mydata

отыщет все фикстуры с именем mydata. Если в каталоге фикстур присутствует файл mydata.json, то он будет загружен как фикстура типа JSON.

Имя фикстуры, указанное в команде, может включать относительный путь. Он будет добавлен в конец пути поиска. Например, команда

django-admin.py loaddata foo/bar/mydata.json

попытается загрузить файлы <appname>/fixtures/foo/bar/mydata.json для каждого установленного приложения, затем файлы <dirname>/foo/bar/ mydata.json из всех каталогов, перечисленных в параметре FIXTURE_DIRS, и, наконец, сам файл foo/bar/mydata.json.

518

Приложение F. Утилита django-admin

Данные из файлов фикстур загружаются в базу без всякой дополнительной обработки. Определенные в моделях методы save и обработчики сигналов pre_save не вызываются.

Отметим, что порядок обработки файлов фикстур не определен. Однако все данные из фикстур загружаются в контексте одной транзакции, поэтому данные из одной фикстуры могут ссылаться на данные из другой фикстуры. Если СУБД поддерживает ограничения на уровне строк, то ограничения проверяются в конце транзакции.

Чтобы создать фикстуры для loaddata, можно использовать команду dumpdata.

Сжатые фикстуры

Фикстуры могут храниться в виде сжатого архива в формате zip, gz или bz2. Например, команда

django-admin.py loaddata mydata.json

будет искать файлы mydata.json, mydata.json.zip, mydata.json.gz и mydata. json.bz2. Просмотр прекращается после обнаружения первого же подходящего файла.

Отметим, что если будут обнаружены две фикстуры с одинаковыми именами, но разного типа (например, если в одном каталоге будут найдены файлы mydata.json и mydata.xml.gz), то установка фикстуры отменяется, и все данные, уже загруженные к этому моменту командой loaddata, удаляются из базы.

MySQL и фикстуры

К сожалению, MySQL не обеспечивает полной поддержки фикстур Django. Для таблиц типа MyISAM не поддерживаются ни транзакции, ни ограничения, поэтому выполнить откат в случае обнаружения конфликтующих фикстур или нарушения ограничений не получится.

А для таблиц типа InnoDB невозможны опережающие ссылки в файлах данных, так как в MySQL не существует механизма, позволяющего откладывать проверку ограничений уровня строки до момента фиксации транзакции.

makemessages

Выполняет обход всего дерева исходных текстов в текущем каталоге и извлекает из файлов строки, помеченные для перевода. Создает (или обновляет) файл сообщений в каталоге conf/locale (в дереве самого Django) или locale (для проектов и приложений). После внесения изменений в файлы сообщений их необходимо откомпилировать командой

Подкоманды

519

compilemessages, подготовив для использования функцией gettext. Подробности см. в главе 19.

Параметр --all

Параметр --all, или -a, используется для обновления файлов сообщений для всех имеющихся языков. Пример:

django-admin.py makemessages --all

Параметр --extension

Параметр --extension, или -e, определяет список расширений просматриваемых файлов (по умолчанию “.html). Пример:

django-admin.py makemessages --locale=de --extension xhtml

Допускается указывать несколько расширений через запятую или повторить параметр -e либо -extension несколько раз:

django-admin.py makemessages --locale=de --extension=html,txt --extension xml

Параметр --locale

Параметр --locale, или -l, определяет подлежащую обработке локаль. Пример:

django-admin.py makemessages --locale=br_PT

Параметр --domain

Параметр --domain, или -d, позволяет изменить домен файлов сообщений. В настоящее время поддерживаются такие домены:

•• django – все файлы с расширениями .py и .html (по умолчанию)

•• djangojs – файлы с расширением .js.

reset <appname appname ...>

Делает то же, что sqlreset для указанных приложений.

Параметр --noinput

Чтобы команда не задавала никаких вопросов типа «Вы уверены?», укажите параметр -noinput. Это полезно, когда django-admin.py запускается в составе автоматизированного сценария, без сопровождения.

runfcgi [параметры]

Запускает процессы FastCGI, способные работать с любым веб-сервером, поддерживающим протокол FastCGI. Подробности см. в главе 12. Требуется Python-модуль FastCGI, который можно загрузить на странице http://trac.saddi.com/flup.