FAQ: Использование Django

Что за ошибка при импорте DJANGO_SETTINGS_MODULE?

Проверьте:

  • Переменная окружения DJANGO_SETTINGS_MODULE указана полностью (например, “mysite.settings”) на существующий модуль.

  • Пропишите модуль в sys.path (import mysite.settings должно помочь).

  • Модуль синтаксически верен и успешно компилируется.

Мне не нравится язык шаблонов, я обязательно должен использовать именно его?

Нам нравится наш язык шаблонов, но утверждать что он единственно верный - сродни религии. В Django нет привязки к нему, так что вы можете подключить Jinja2, Mako и пр.

Мне обязательно нужно пользоваться слоем с вашей реализацией моделей?

Нет, как и с языком шаблонов, модели отделены от всего фреймворка.

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

Как использовать поля для загрузки картинок и файлов?

Для них предназначены специальные классы (FileField и ImageField). Использовать их можно так:

  1. В файле настроек нужно указать MEDIA_ROOT - полный путь к каталогу, где Django будет хранить загруженные файлы. Для быстродействия не стоит хранить их в базе данных. Определите MEDIA_URL - базовый URL к этому каталогу и убедитесь, что у веб-сервера есть права на запись туда файлов.

  2. В полях типа FileField или ImageField вашей модели установите upload_to равным пути к каталогу, в котором будут сохраняться файлы. Путь должен быть относительным к MEDIA_ROOT.

  3. Всё, что будет сохранено в базу данных - путь к файлу (относительно MEDIA_ROOT). Для удобного получения URL к файлу можно использовать url. Например, если поле типа ImageField называется mug_shot, то получить абсолютный путь в шаблоне можно следующим образом {{ object.mug_shot.url }}.

Как сделать переменную доступной во всех шаблонах?

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

Однако верное решение состоит в использовании RequestContext. Подробнее можно посмотреть в Классы наследники Context: RequestContext.