Django admin — Вопрос по Django2


Содержание

Подключение интерфейса администратора Django

В предыдущих мануалах этой серии Django вы узнали, как запустить приложение Django, связать его с MySQL и создать модели баз данных Posts и Comments.

Читайте также:

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

Стоит отметить: официальная документация Django указывает, что автоматически созданный интерфейс администратора Django идеально подходит для внутреннего использования организации, однако создавать веб-приложение на его основе крайне не рекомендуется. Чтобы сделать интерфейс более ориентированным на процесс, лучше написать собственные виды для администраторской части.

1: Включение Django Admin

Чтобы включить Django Admin, нужно добавить его в список INSTALLED_APPS в файле settings.py.

Перейдите в каталог:

Теперь откройте settings.py:

Если django.contrib.admin еще нет в списке INSTALLED_APPS, добавьте в список эту строку. Список должен выглядеть так:

.
# Application definition
INSTALLED_APPS = [
‘blogsite’,
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
]
.

Сохраните и закройте файл.

Затем откройте файл urls.py:

Этот файл должен выглядеть так:

.
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r’^admin/’, admin.site.urls),
]

Как видите, значение r^admin/ передается аргументу url. Так Python выполняет регулярные выражения.

Регулярные выражения – это способ поиска или сопоставления строковых шаблонов. Python использует r, чтобы интерпретировать следующий текст после символа каретки (^) как необработанную строку. Другими словами, специальные символы, такие как слеш (/), будут интерпретироваться так, как они есть, что полезно в случае с urls.

Теперь, когда веб-проект Django имеет соответствующий код в файлах settings.py и urls.py, у приложения есть доступ к моделям и пользовательскому интерфейсу администратора.

2: Проверка установки Django Admin

Теперь нужно мигрировать модели в БД, чтобы она смогла обрабатывать новые модели Admin.

Откройте каталог, в котором хранится файл manage.py.

Запустите команду migrate, чтобы обновить модели (это нужно делать всякий раз, когда вы вносите какие-либо изменения в модели).

python3 manage.py migrate

Команда должна вернуть следующий вывод, потому что модель admin уже была добавлена, как вы видели при навигации по разделам INSTALLED_APPS файла settings.py.

Operations to perform:
Apply all migrations: admin, auth, blogsite, contenttypes, sessions
Running migrations:
No migrations to apply.

Теперь можно запустить сервер с помощью команды:

python3 manage.py runserver your-server-ip:8000

Затем можно открыть URL панели администратора в браузере:

На экране появится форма входа.

Если это так – вы успешно включили интерфейс администратора.

Однако пока что у вас нет аккаунта администратора. Создайте такой аккаунт, чтобы войти в интерфейс.

3: Создание учетной записи администратора

В браузере открывается страница входа в интерфейс, но пока что у вас нет учетных данных. Создать эти данные совсем не сложно.

Django предоставляет простой способ создания учетной записи суперпользователя. Для этого нужно запустить файл manage.py.

python3 manage.py createsuperuser

После этого будет запрошено имя пользователя, электронная почта и пароль. В данном руководстве используются условные данные admin_user, 8host@example.com и admin123. Укажите свои учетные данные, используйте сложный пароль.

Username (leave blank to use ‘root’): admin_user
Email address: 8host@example.com

Затем программа попросит дважды ввести пароль администратора в поле Password. При этом в поле не будут отображаться никакие символы – это делается в целях безопасности. Введя пароль, нажмите enter.

Password:
Password (again):

На данный момент у вас есть учетная запись администратора admin_user с паролем admin123.

Давайте попробуем войти в интерфейс администратора.

Откройте в браузере страницу:

Затем войдите в интерфейс, указав имя и пароль, которые вы только что создали. Вы получите доступ к странице Site administration.

Теперь нужно подключить блог к панели администратора.

4: Создание URL-шаблонов для моделей Post и Comment

Как видите, интерфейс администратора до сих пор не видит ваше приложение. Чтобы изменить это, нужно добавить и зарегистрировать блог с соответствующими моделями Post и Comment.

Создайте пустой файл urls.py в каталоге blogsite:

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

Перейдите к каталогу, в котором хранится файл urls.py.

Добавьте в него такой код:

from django.conf.urls import url
from . import views
urlpatterns = [
url(r’^$’, views.posts, name=’posts’),
url(r’^$’, views.comments, name=’comments’)
]

Это выражения шаблонов URL, с помощью которых приложение может получить доступ к представлениям (views) для Posts и Comments (пока что их нет, но об этом речь пойдет в одном из мануалов данной серии).

5: Подключение блога к Django Admin

Подключив блог к интерфейсу администратора, вы сможете увидеть ссылки на Posts и Comments в панели. Как вы уже видели, на данный момент панель отображает только ссылки на Groups и Users.

Зарегистрируйте модели Posts и Comments в файле admin в каталоге blogsite.

Затем создайте файл admin.py:

Добавьте в файл следующие строки:

from django.contrib import admin
from blogsite.models import Post
from blogsite.models import Comment
admin.site.register(Post)
admin.site.register(Comment)

Сохраните и закройте файл.

Теперь модели Post и Comment зарегистрированы в панели администратора. Это позволит интерфейсу администратора выбирать эти модели и показывать их пользователю, который имеет доступ к панели.

6: Проверка настроек

Теперь, когда вы добавили соответствующий код Python, запустите сервер. Откройте страницу:

и войдите в аккаунт администратора, используя свои учетные данные.

На странице Site authorization вы увидите, что кроме моделей Authorization and authentication появится группа Blogsite, в которой будут ваши модели блога.

Заключение

Вы успешно подключили панель администратора к блогу.

Интерфейс администратора Django позволяет создавать сообщения и отслеживать комментарии в блоге.

В следующем мануале этой серии вы научитесь создавать представления для приложения.

Что нужно знать, чтобы управлять пользователями в Django Admin

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

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

Знаете ли вы, что сотрудники, которые управляют другими пользователями в Django Admin, могут редактировать свои собственные разрешения? Знаете ли вы, что они также могут стать суперпользователями? В админке Django нет ничего, что могло бы этому помешать, так что это решать вам!

К концу этого урока вы узнаете, как:

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

Модель Permissions (Разрешения)

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

Django поставляется со встроенной системой аутентификации. Система аутентификации включает пользователей, группы и разрешения.

При создании модели Django автоматически создает четыре разрешения по умолчанию для следующих действий:

  1. add : Пользователи с этим разрешением могут добавить экземпляр модели.
  2. delete : Пользователи с этим разрешением могут удалить экземпляр модели.
  3. change : Пользователи с этим разрешением могут обновить экземпляр модели.
  4. view : Пользователи с этим разрешением могут просматривать экземпляры этой модели. Это разрешение было очень ожидаемым, и, наконец, оно было добавлено в Django 2.1.

Имена разрешений следуют особому соглашению об именах: ._ .

Давайте рассмотрим это подробнее:

  • это имя приложения. Например модель User импортируется из auth (django.contrib.auth).
  • является одним из действий указаных выше ( add , delete , change , или view ).
  • это название модели, все строчные буквы.

Знание этого соглашения об именах поможет вам легче управлять разрешениями. Например, имя разрешения на изменение пользователя – auth.change_user.

Как проверяются права

Модель permissions предоставляется пользователям или группам. Чтобы проверить, есть ли у пользователя определенные разрешения, вы можете сделать следующее:

Стоит отметить, что .has_perm() всегда будет возвращать True для активного суперпользователя, даже если разрешение на самом деле не существует:

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

Как применяются права

Модели Django сами обычно не используют разрешения. По умолчанию единственные права доступа – это права для Django Admin.

Причина, по которой модели обычно не используют разрешения, заключается в том, что, как правило, модель не знает о пользователе, выполняющем действие. В приложениях Django объект пользователя обычно находиться в запросе. Вот почему в большинстве случаев разрешения применяются на уровне представления (вьюх).

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

Если пользователь, сделавший запрос, вошел в систему и прошел проверку подлинности, то request.user будет содержать экземпляр User. Если пользователь не вошел в систему, то request.user будет экземпляром AnonymousUser. Это специальный объект, используемый Django для обозначения неаутентифицированного пользователя. Использование has_perm в AnonymousUser всегда возвращает False.

Если пользователь, отправляющий запрос, не имеет разрешения view_user, вы должны создать исключение PermissionDenied, и клиенту должен вернуться ответ со статусом 403.

Чтобы упростить применение разрешений в представлениях, Django предоставляет сокращенный декоратор под названием permission_required , который делает то же самое:

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

Некоторые популярные сторонние приложения, такие как Django rest framework, также предоставляют полезную интеграцию с разрешениями модели Django.

Django Admin и модель Permissions

Django admin имеет очень тесную интеграцию со встроенной системой аутентификации, в частности, с моделью permissions. Django admin «из коробки» использует модель permissions:

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

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

Реализация пользовательских бизнес-ролей в Django Admin

Одним из наиболее уязвимых мест в каждом приложении является система аутентификации. В приложениях Django это модель User. Итак, чтобы лучше защитить ваше приложение, вы должны начать с модели User.

Во-первых, вам нужно взять под контроль страницу администратора модели User. Django уже поставляется с очень хорошей страницей администратора для управления пользователями. Чтобы воспользоваться этой замечательной работой, не нужно создавать новую страницу а нужно расширить уже встроенную модель User в Django admin.

Setup: Пользовательская регистрация модели User

Чтобы расширить страницу администратора для модели User, вам нужно отменить текущую регистрацию администратора модели, предоставленного Django, и зарегистрировать собственную:

CustomUserAdmin расширяет UserAdmin в Django. На этом этапе, если вы войдете в систему Django Admin по адресу http://127.0.0.1:8000/admin/auth/user, вы должны увидеть, что страница администратора пользователей не изменилась:

Запрет на обновление полей

Необслуживаемые формы администратора – главный кандидат на ужасные ошибки. Пользователь может легко обновить экземпляр модели через Django Admin, чего приложение не ожидает. В большинстве случаев пользователь даже не заметит, что что-то не так. Такие ошибки обычно очень трудно отследить и исправить.

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

Если вы не хотите, чтобы какой-либо пользователь, включая суперпользователей, обновлял поле, вы можете пометить такое поле как поле только для чтения. Например, поле date_joined устанавливается при регистрации пользователя. Эта информация никогда не должна изменяться любым пользователем, поэтому вы можете пометить его только для чтения:

Когда поле добавлено в readonly_fields, оно не будет редактироваться в форме изменения по умолчанию. Когда поле помечено как доступное только для чтения, Django будет отображать элемент ввода как отключенный.

Но что, если вы хотите запретить обновление поля только некоторым пользователям?

Условный запрет на обновление полей

Иногда полезно обновить поля прямо в админке. Но что если вы не хотите, чтобы какой-либо пользователь делал это: вы хотите, чтобы это могли делать только суперпользователи.

Допустим, вы хотите запретить пользователям, не являющимся суперпользователями, изменять имя пользователя. Для этого вам нужно изменить форму изменений, сгенерированную Django, и отключить поле имени пользователя на основе текущего пользователя:

Давайте разберем что тут было сделано:

  • Чтобы внести коррективы в форму, нужно переопределить get_form(). Эта функция используется Django для создания формы изменения по умолчанию для модели.
  • Чтобы условно отключить поле, сначала нужно получить форму по умолчанию, созданную Django, а затем, если пользователь не является суперпользователем, отключить поле имени пользователя.

Теперь, когда не-суперпользователь пытается отредактировать пользователя, поле username будет отключено. Любая попытка изменить username через Django Admin потерпит неудачу. Когда суперпользователь пытается отредактировать пользователя, поле username будет редактируемым и будет вести себя как положено.

Запретить не суперпользователям предоставлять права суперпользователя

Суперпользователь – это очень строгое разрешение, которое не должно предоставляться легко. Однако любой пользователь с разрешением на изменение модели User может сделать любого пользователя суперпользователем, в том числе и себя. Это противоречит всей цели системы разрешений, поэтому вам нужно закрыть эту дыру.

На основании предыдущего примера, чтобы не допустить превращения не суперпользователей в суперпользователей, добавьте следующее ограничение:

В дополнение к предыдущему примеру тут сделаны следующие дополнения:

  1. Инициализирован пустой набор disabled_fields, который будет содержать поля для отключения. set – это структура данных, которая содержит уникальные значения. В этом случае имеет смысл использовать set, потому что вам нужно отключить поле только один раз. Оператор |= используется для выполнения обновления на месте OR (ИЛИ). Для получения дополнительной информации о set, почитайте это Sets in Python.
  2. Затем, если пользователь является суперпользователем, было добавлено в set два поля (username из предыдущего примера и is_superuser). Они будут препятствовать тому, чтобы не-суперпользователи становились суперпользователями.
  3. Наконец, далее перебираются все поля в set, и помечаются как отключенные.

Django User Admin Двухступенчатая форма

Когда вы создаете нового пользователя в Django admin, вы проходите двухэтапную форму. В первой форме вы вводите имя пользователя и пароль. Во второй форме вы обновляете остальные поля.

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

Предоставление разрешений только через использования групп

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

Чтобы управлять разрешениями только с помощью групп, необходимо запретить пользователям предоставлять разрешения конкретным пользователям. и разрешить объединение пользователей в группы. Для нужно отключить поле user_permissions для всех не суперпользователей:

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

Запрет не суперпользователям редактировать свои собственные разрешения

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

Аргумент obj является экземпляром объекта, с которым вы сейчас работаете:

  • Когда obj имеет значение None, форма используется для создания нового пользователя.
  • Когда obj не None, форма используется для редактирования существующего пользователя.

Чтобы проверить, работает ли пользователь, выполняющий запрос, с самим собой, нужно сравнить request.user с obj. Поскольку это пользователь admin, obj является экземпляром User или None. Когда пользователь, делающий запрос, request.user, равен obj, это означает, что пользователь обновляет самого себя. В этом случае мы отключаем все конфиденциальные поля, которые можно использовать для получения разрешений.

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

Переопределение разрешений

Иногда бывает полезно полностью переопределить разрешения в админке Django. Распространенный сценарий – это когда вы используете разрешения в других местах и не хотите, чтобы штатные пользователи вносили изменения в администраторе.

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

Чтобы запретить сотрудникам удалять экземпляр модели, независимо от их прав доступа, вы можете сделать следующее:

Как и в случае с get_form(), obj – это экземпляр, с которым вы сейчас работаете:

  • Когда obj имеет значение None, пользователь запрашивает представление списка.
  • Когда obj не None, пользователь запрашивает представление изменения конкретного экземпляра.

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

  • Предотвращение изменений в рабочее время
  • Реализация разрешений на уровне объектов

Ограничение доступа к настраиваемым действиям

Пользовательские admin действия (action) требуют особого внимания. Django не имеет полной интеграции с ними, поэтому не может ограничить доступ к ним по умолчанию. Пользовательские действия будут доступны любому администратору с любым разрешением на модель.

Чтобы проиллюстрировать это, добавьте действие администратора, которое помечает нескольких пользователей как активных:

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

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

Django admin использует внутреннюю функцию для получения действий. Чтобы скрыть activate_users() от пользователей без разрешения на изменение, переопределите get_actions():

get_actions() возвращает OrderedDict. Ключ – это имя действия, а значение – это функция действия. Чтобы скорректировать возвращаемое значение, нужно переопределить функцию, выбираете исходное значение и, в зависимости от прав пользователя, удалить настраиваемое действие activate_users из dict.

Для сотрудников, у которых нет прав на change_user(), действие activate_users не будет отображаться в раскрывающемся списке действий.

Заключение

Django admin – отличный инструмент для управления проектом Django. Многие команды полагаются на это, чтобы оставаться продуктивным в управлении повседневными операциями. Если вы используете Django admin для выполнения операций над моделями, важно знать о разрешениях. Методы, описанные в этой статье, полезны для любой модели, а не только для модели User.

В этом руководстве вы защитили свою систему, внеся следующие изменения в Django Admin:

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

Лучшие django-admin вопросы ИТ разработчиков

Два аргумента в пользовательской команде django-admin

Django — Как получить URL администратора из экземпляра модели

Хранение содержимого файла в БД

Я делаю модель, в которой у меня есть

Apache 403 при обслуживании статических файлов Django

Я просмотрел множество связанных постов, но, похоже, ничего не помогало. Соответствующая информация: Django version — 1.4 Apache version — 2.2 .

Переопределить форму в админке Django

В Django admin я хочу переопределить и реализовать свою собственную форму для модели (например, модель счета-фактуры). Я хочу, чтобы в форме счета-фактуры б.

Настройте Django Admin: добавьте больше одного встроенного по умолчанию в родительский Add_View

django — админовские модели «многие ко многим», использующие through = и filter_horizontal

Вот как выглядят мои модели:

Django Admin: порядок по значению на связанном внешнем ключе

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

Изменить локаль для django-admin-tools

Джанго статическая страница?

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

Django — переопределить форму входа на сайт администратора

В настоящее время я пытаюсь переопределить форму по умолчанию, используемую в Django 1.4 при входе на сайт администратора (мой сайт использует дополнительное.

Ошибка запроса соответствия сайта после создания администратора django

Я прохожу стандартное руководство по Django, чтобы создать администратора для приложения. После того, как я прокомментировал связанные с администратором вещи.

Ничего не происходит, когда я делаю: команда python manage.py

Я новичок в django и сейчас прохожу основной урок. Несмотря на то, что это работало ранее, когда я выполняю python manage.py runserver ИЛИ python manage.py -.

Ограничение прав на изменение администратора Django

Я пытаюсь запретить пользователям в группах изменять поля, в которых у группы нет прав на изменение. Например:

Пользовательские шаблоны администратора django не работают

Я пытался получить пользовательские шаблоны для страницы администрирования для Django, но безуспешно. Я прочитал документацию по django и несколько блогов, к.

django users and groups — показать членство в группе в админке?

Создание пользовательских фильтров для list_filter в Django Admin

Я хотел бы сделать пользовательские фильтры для администратора django вместо обычного «is_staff» и «is_superuser». Я прочитал этоlist_filter в Django Docs. П.

Разрешение символа «-» в именах пользователей в интерфейсе администратора Django

В нашем веб-приложении нам нужно было разрешить тире & quot; — & quot; в наших именах пользователей. Я включил это для процесса регистрации потребителя прост.

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

У меня есть приложение Django, которое имеет две модели, подобные этой:

Django: дата последнего мода и количество модов

У меня есть модель Django под названием

Как исправить / установить ширину столбца в таблице списка изменений modeladmin django при добавлении list_filter?

Я работаю над улучшением admin.py в проекте django, и, хотя я не совсем удивлен тем, как выходит таблица с тремя полями в list_diplay, по крайней мере, это л.

Переопределение размера Django Admin Multi-select W >

Поле выбора администратора Django

У меня есть модель, которая имеет CharField и в админ я хочу добавить варианты в виджет. Причина этого в том, что я использую модель прокси-сервера, и есть н.

Разрешение_обязательный декоратор не работает для меня

Я не могу понять, почему не требуется разрешение, требуемое декоратором. Я хотел бы разрешить доступ к просмотру только для сотрудников. я пытался

пользователь автообновления django; save () получил неожиданный аргумент ключевого слова ‘force_insert’

Я пытаюсь реализовать автоматическое обновление для пользователя, который создает запись, используяModelAdmin save_model как описаноВот, Я не смог разобратьс.

Django: дата последнего мода и количество модов

У меня есть модель Django под названием .I ‘

Как исправить / установить ширину столбца в таблице списка изменений modeladmin django при добавлении list_filter?

я работаю над улучшением admin.py в проекте Django, и пока яЯ не совсем удивлен тем, как таблица выходит с тремя полями в list_diplay, по крайней мере, это &.

Переопределение размера Django Admin Multi-select W > Вопрос новичка Джанго: яМне бы хотелось, чтобы администратор Django отображал больше строк выбора в виджете с множественным выбором. У меня есть очень длинны.


Поле выбора администратора Django

У меня есть модель, которая имеет CharField и в админ я хочу добавить варианты в виджет. Причина этого в том, что яЯ использую модель прокси, и есть нескольк.

пользователь автообновления django; save () получил неожиданный аргумент ключевого слова ‘force_insert’

Перенаправить на администратора Сохранить

Как я могу перенаправить пользователя в другое приложение при сохранении?У меня есть два приложения, скажем

Как отформатировать DateTimeField в Django Admin по местному времени?

Как отформатировать DateTimeField в Admin в соответствии с местным временем и часовым поясом?Мои settings.py:

Пользовательская модель пользователя в django не позволяет устанавливать пароль в админке

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

Documentation

The Django admin site¶

One of the most powerful parts of Django is the automatic admin interface. It reads metadata from your models to provide a quick, model-centric interface where trusted users can manage content on your site. The admin’s recommended use is limited to an organization’s internal management tool. It’s not intended for building your entire front end around.

The admin has many hooks for customization, but beware of trying to use those hooks exclusively. If you need to provide a more process-centric interface that abstracts away the implementation details of database tables and fields, then it’s probably time to write your own views.

In this document we discuss how to activate, use, and customize Django’s admin interface.

Overview¶

The admin is enabled in the default project template used by startproject .

If you’re not using the default project template, here are the requirements:

After you’ve taken these steps, you’ll be able to use the admin site by visiting the URL you hooked it into ( /admin/ , by default).

If you need to create a user to login with, use the createsuperuser command. By default, logging in to the admin requires that the user has the is_superuser or is_staff attribute set to True .

Finally, determine which of your application’s models should be editable in the admin interface. For each of those models, register them with the admin as described in ModelAdmin .

Other topics¶

For information about serving the static files (images, JavaScript, and CSS) associated with the admin in production, see Serving files .

Having problems? Try FAQ: The admin .

ModelAdmin objects¶

The ModelAdmin > admin.py in your application. Let’s take a look at a very simple example of the ModelAdmin :

Do you need a ModelAdmin object at all?

In the preceding example, the ModelAdmin > ModelAdmin object at all – you can register the model > ModelAdmin description. The preceding example could be simplified to:

The register decorator¶

There is also a decorator for registering your ModelAdmin classes:

It’s given one or more model > ModelAdmin . If you’re using a custom AdminSite , pass it using the site keyword argument:

You can’t use this decorator if you have to reference your model admin > __init__() method, e.g. super(PersonAdmin, self).__init__(*args, **kwargs) . You can use super().__init__(*args, **kwargs) .

Discovery of admin files¶

When you put ‘django.contrib.admin’ in your INSTALLED_APPS setting, Django automatically looks for an admin module in each application and imports it.

A dotted import path to the default admin site’s > ‘django.contrib.admin.sites.AdminSite’ . See Overriding the default admin site for usage.

This function attempts to import an admin module in each installed application. Such modules are expected to register models with the admin.

Typically you won’t need to call this function directly as AdminConfig calls it when Django starts.

If you are using a custom AdminSite , it is common to import all of the ModelAdmin sub > AdminSite . In that case, in order to disable auto-discovery, you should put ‘django.contrib.admin.apps.SimpleAdminConfig’ instead of ‘django.contrib.admin’ in your INSTALLED_APPS setting.

ModelAdmin options¶

The ModelAdmin is very flexible. It has several options for dealing with customizing the interface. All options are defined on the ModelAdmin subclass:

A list of actions to make available on the change list page. See Admin actions for details.

ModelAdmin. actions_on_top ¶ ModelAdmin. actions_on_bottom ¶

Controls where on the page the actions bar appears. By default, the admin changelist displays actions at the top of the page ( actions_on_top = True; actions_on_bottom = False ).

Controls whether a selection counter is displayed next to the action dropdown. By default, the admin changelist will display it ( actions_selection_counter = True ).

Set date_hierarchy to the name of a DateField or DateTimeField in your model, and the change list page will include a date-based drilldown navigation by that field.

You can also specify a field on a related model using the __ lookup, for example:

This will intelligently populate itself based on available data, e.g. if all the dates are in one month, it’ll show the day-level drill-down only.

date_hierarchy uses QuerySet.datetimes() internally. Please refer to its documentation for some caveats when time zone support is enabled ( USE_TZ = True ).

This attribute overr > None , empty string, etc.). The default value is — (a dash). For example:

You can also overr > empty_value_display for all admin pages with AdminSite.empty_value_display , or for specific fields like this:

This attribute, if given, should be a list of field names to exclude from the form.

For example, let’s consider the following model:

If you want a form for the Author model that includes only the name and title fields, you would specify fields or exclude like this:

Since the Author model only has three fields, name , title , and birth_date , the forms resulting from the above declarations will contain exactly the same fields.

Use the fields option to make simple layout changes in the forms on the “add” and “change” pages such as showing only a subset of available fields, modifying their order, or grouping them into rows. For example, you could define a simpler version of the admin form for the django.contrib.flatpages.models.FlatPage model as follows:

In the above example, only the fields url , title and content will be displayed, sequentially, in the form. fields can contain values defined in ModelAdmin.readonly_fields to be displayed as read-only.

For more complex layout needs, see the fieldsets option.

The fields option accepts the same types of values as list_display , except that callables aren’t accepted. Names of model and model admin methods will only be used if they’re listed in readonly_fields .

To display multiple fields on the same line, wrap those fields in their own tuple. In this example, the url and title fields will display on the same line and the content field will be displayed below them on its own line:

This fields option should not be confused with the fields dictionary key that is within the fieldsets option, as described in the next section.

If neither fields nor fieldsets options are present, Django will default to displaying each field that isn’t an AutoField and has editable=True , in a single fieldset, in the same order as the fields are defined in the model.

Set fieldsets to control the layout of admin “add” and “change” pages.

fieldsets is a list of two-tuples, in which each two-tuple represents a on the admin form page. (A is a “section” of the form.)

The two-tuples are in the format (name, field_options) , where name is a string representing the title of the fieldset and field_options is a dictionary of information about the fieldset, including a list of fields to be displayed in it.

This results in an admin page that looks like:

If neither fieldsets nor fields options are present, Django will default to displaying each field that isn’t an AutoField and has editable=True , in a single fieldset, in the same order as the fields are defined in the model.

The field_options dictionary can have the following keys:

A tuple of field names to display in this fieldset. This key is required.

As with the fields option, to display multiple fields on the same line, wrap those fields in their own tuple. In this example, the first_name and last_name fields will display on the same line:

fields can contain values defined in readonly_fields to be displayed as read-only.

If you add the name of a callable to fields , the same rule applies as with the fields option: the callable must be listed in readonly_fields .

A list or tuple containing extra CSS classes to apply to the fieldset.

Two useful > collapse and wide . Fieldsets with the collapse style will be initially collapsed in the admin and replaced with a small “click to expand” link. Fieldsets with the wide style will be given extra horizontal space.

A string of optional extra text to be displayed at the top of each fieldset, under the heading of the fieldset. This string is not rendered for TabularInline due to its layout.

Note that this value is not HTML-escaped when it’s displayed in the admin interface. This lets you include HTML if you so desire. Alternatively you can use plain text and django.utils.html.escape() to escape any HTML special characters.

Same as filter_horizontal , but uses a vertical display of the filter interface with the box of unselected options appearing above the box of selected options.

If you define the Meta.model attribute on a ModelForm , you must also define the Meta.fields attribute (or the Meta.exclude attribute). However, since the admin has its own way of defining fields, the Meta.fields attribute will be ignored.

If the ModelForm is only going to be used for the admin, the easiest solution is to omit the Meta.model attribute, since ModelAdmin will prov > fields = [] in the Meta > ModelForm .

If your ModelForm and ModelAdmin both define an exclude option then ModelAdmin takes precedence:

In the above example, the “age” field will be excluded but the “name” field will be included in the generated form.

This prov > Field options for use in the admin. formfield_overrides is a dictionary mapping a field class to a dict of arguments to pass to the field at construction time.

Since that’s a bit abstract, let’s look at a concrete example. The most common use of formfield_overrides is to add a custom w > RichTextEditorWidget that we’d like to use for large text fields instead of the default

. Here’s how we’d do that:

Note that the key in the dictionary is the actual field > __init__() method. See The Forms API for details.

If you want to use a custom w > ForeignKey or ManyToManyField ), make sure you haven’t included that field’s name in raw_id_fields , radio_fields , or autocomplete_fields .

formfield_overrides won’t let you change the w > raw_id_fields , radio_fields , or autocomplete_fields set. That’s because raw_id_fields , radio_fields , and autocomplete_fields imply custom widgets of their own.

Set list_display to control which fields are displayed on the change list page of the admin.

If you don’t set list_display , the admin site will display a single column that displays the __str__() representation of each object.

There are four types of values that can be used in list_display :

The name of a model field. For example:

A callable that accepts one argument, the model instance. For example:

A string representing a ModelAdmin method that accepts one argument, the model instance. For example:

A string representing a model attribute or method (without any required arguments). For example:

A few special cases to note about list_display :

If the field is a ForeignKey , Django will display the __str__() of the related object.

ManyToManyField fields aren’t supported, because that would entail executing a separate SQL statement for each row in the table. If you want to do this nonetheless, give your model a custom method, and add that method’s name to list_display . (See below for more on custom methods in list_display .)

If the field is a BooleanField , Django will display a pretty “on” or “off” icon instead of True or False .

If the string given is a method of the model, ModelAdmin or a callable, Django will HTML-escape the output by default. To escape user input and allow your own unescaped tags, use format_html() .

Here’s a full example model:

As some examples have already demonstrated, when using a callable, a model method, or a ModelAdmin method, you can customize the column’s title by adding a short_description attribute to the callable.

Or on a field level:

If the string given is a method of the model, ModelAdmin or a callable that returns True or False Django will display a pretty “on” or “off” icon if you give the method a boolean attribute whose value is True .

Here’s a full example model:

The __str__() method is just as val > list_display as any other model method, so it’s perfectly OK to do this:

Usually, elements of list_display that aren’t actual database fields can’t be used in sorting (because Django does all the sorting at the database level).

However, if an element of list_display represents a certain database field, you can indicate this fact by setting the admin_order_field attribute of the item.

The above will tell Django to order by the first_name field when trying to sort by colored_first_name in the admin.

To indicate descending order with admin_order_field you can use a hyphen prefix on the field name. Using the above example, this would look like:

admin_order_field supports query lookups to sort by values on related models. This example includes an “author first name” column in the list display and allows sorting it by first name:

Query expressions may be used in admin_order_field . For example:

Support for expressions in admin_order_field was added.

Elements of list_display can also be properties. Please note however, that due to the way properties work in Python, setting short_description on a property is only possible when using the property() function and not with the @property decorator.

The field names in list_display will also appear as CSS > column- on each

element. This can be used to set column widths in a CSS file for example.

Django will try to interpret every element of list_display in this order:

  • A field of the model.
  • A callable.
  • A string representing a ModelAdmin attribute.
  • A string representing a model attribute.

For example if you have first_name as a model field and as a ModelAdmin attribute, the model field will be used.

Use list_display_links to control if and which fields in list_display should be linked to the “change” page for an object.

By default, the change list page will link the first column – the first field specified in list_display – to the change page for each item. But list_display_links lets you change this:

Set it to None to get no links at all.

Set it to a list or tuple of fields (in the same format as list_display ) whose columns you want converted to links.

You can specify one or many fields. As long as the fields appear in list_display , Django doesn’t care how many (or how few) fields are linked. The only requirement is that if you want to use list_display_links in this fashion, you must define list_display .

In this example, the first_name and last_name fields will be linked on the change list page:

In this example, the change list page grid will have no links:

Set list_editable to a list of field names on the model which will allow editing on the change list page. That is, fields listed in list_editable will be displayed as form widgets on the change list page, allowing users to edit and save multiple rows at once.

list_editable interacts with a couple of other options in particular ways; you should note the following rules:

  • Any field in list_editable must also be in list_display . You can’t edit a field that’s not displayed!
  • The same field can’t be listed in both list_editable and list_display_links – a field can’t be both a form and a link.

You’ll get a validation error if either of these rules are broken.

Set list_filter to activate filters in the right sidebar of the change list page of the admin, as illustrated in the following screenshot:

list_filter should be a list or tuple of elements, where each element should be of one of the following types:

a field name, where the specified field should be either a BooleanField , CharField , DateField , DateTimeField , IntegerField , ForeignKey or ManyToManyField , for example:

Field names in list_filter can also span relations using the __ lookup, for example:

a > django.contrib.admin.SimpleListFilter , which you need to prov > title and parameter_name attributes to and overr > lookups and queryset methods, e.g.:

As a convenience, the HttpRequest object is passed to the lookups and queryset methods, for example:

Also as a convenience, the ModelAdmin object is passed to the lookups method, for example if you want to base the lookups on the available data:

a tuple, where the first element is a field name and the second element is a > django.contrib.admin.FieldListFilter , for example:

You can limit the choices of a related model to the objects involved in that relation using RelatedOnlyFieldListFilter :

Assuming author is a ForeignKey to a User model, this will limit the list_filter choices to the users who have written a book instead of listing all users.

The FieldListFilter API is considered internal and might be changed.

List filter’s typically appear only if the filter has more than one choice. A filter’s has_output() method controls whether or not it appears.

It is possible to specify a custom template for rendering a list filter:

See the default template prov > admin/filter.html ) for a concrete example.

Set list_max_show_all to control how many items can appear on a “Show all” admin change list page. The admin will display a “Show all” link on the change list only if the total result count is less than or equal to this setting. By default, this is set to 200 .

Set list_per_page to control how many items appear on each paginated admin change list page. By default, this is set to 100 .

Set list_select_related to tell Django to use select_related() in retrieving the list of objects on the admin change list page. This can save you a bunch of database queries.

The value should be either a boolean, a list or a tuple. Default is False .

When value is True , select_related() will always be called. When value is set to False , Django will look at list_display and call select_related() if any ForeignKey is present.

If you need more fine-grained control, use a tuple (or list) as value for list_select_related . Empty tuple will prevent Django from calling select_related at all. Any other tuple will be passed directly to select_related as parameters. For example:

will call select_related(‘author’, ‘category’) .

If you need to specify a dynamic value based on the request, you can implement a get_list_select_related() method.

ModelAdmin ignores this attribute when select_related() was already called on the changelist’s QuerySet .

Set ordering to specify how lists of objects should be ordered in the Django admin views. This should be a list or tuple in the same format as a model’s ordering parameter.

If this isn’t provided, the Django admin will use the model’s default ordering.

If you need to specify a dynamic order (for example depending on user or language) you can implement a get_ordering() method.

Performance considerations with ordering and sorting

To ensure a deterministic ordering of results, the changelist adds pk to the ordering if it can’t find a single or unique together set of fields that provide total ordering.

For example, if the default ordering is by a non-unique name field, then the changelist is sorted by name and pk . This could perform poorly if you have a lot of rows and don’t have an index on name and pk .

The paginator > django.core.paginator.Paginator is used. If the custom paginator > django.core.paginator.Paginator , you will also need to prov > ModelAdmin.get_paginator() .

Set prepopulated_fields to a dictionary mapping field names to the fields it should prepopulate from:

When set, the given fields will use a bit of JavaScript to populate from the fields assigned. The main use for this functionality is to automatically generate the value for SlugField fields from one or more other fields. The generated value is produced by concatenating the values of the source fields, and then by transforming that result into a valid slug (e.g. substituting dashes for spaces; lowercasing ASCII letters; and removing various English stop words such as ‘a’, ‘an’, ‘as’, and similar).

Prepopulated fields aren’t modified by JavaScript after a value has been saved. It’s usually undesired that slugs change (which would cause an object’s URL to change if the slug is used in it).

prepopulated_fields doesn’t accept DateTimeField , ForeignKey , OneToOneField , and ManyToManyField fields.

The admin now preserves filters on the list view after creating, editing or deleting an object. You can restore the previous behavior of clearing filters by setting this attribute to False .

By default, Django’s admin uses a select-box interface ( ) for fields that are ForeignKey or have choices set. If a field is present in radio_fields , Django will use a radio-button interface instead. Assuming group is a ForeignKey on the Person model:

You have the choice of using HORIZONTAL or VERTICAL from the django.contrib.admin module.

Don’t include a field in radio_fields unless it’s a ForeignKey or has choices set.

autocomplete_fields is a list of ForeignKey and/or ManyToManyField fields you would like to change to Select2 autocomplete inputs.

By default, the admin uses a select-box interface ( ) for those fields. Sometimes you don’t want to incur the overhead of selecting all the related instances to display in the dropdown.

The Select2 input looks similar to the default input but comes with a search feature that loads the options asynchronously. This is faster and more user-friendly if the related model has many instances.

You must define search_fields on the related object’s ModelAdmin because the autocomplete search uses it.

To avo > view or change permission to the related object in order to use autocomplete.

Ordering and pagination of the results are controlled by the related ModelAdmin ’s get_ordering() and get_paginator() methods.

In the following example, ChoiceAdmin has an autocomplete field for the ForeignKey to the Question . The results are filtered by the question_text field and ordered by the date_created field:

Performance considerations for large datasets

Ordering using ModelAdmin.ordering may cause performance problems as sorting on a large queryset will be slow.

Also, if your search fields include fields that aren’t indexed by the database, you might encounter poor performance on extremely large tables.

You may also want to change the Paginator on very large tables as the default paginator always performs a count() query. For example, you could overr > Paginator.count property.

By default, Django’s admin uses a select-box interface ( ) for fields that are ForeignKey . Sometimes you don’t want to incur the overhead of having to select all the related instances to display in the drop-down.

raw_id_fields is a list of fields you would like to change into an Input w > ForeignKey or ManyToManyField :

The raw_id_fields Input w > ForeignKey or a comma separated list of values if the field is a ManyToManyField . The raw_id_fields widget shows a magnifying glass button next to the field which allows users to search for and select a value:

By default the admin shows all fields as editable. Any fields in this option (which should be a list or tuple ) will display its data as-is and non-editable; they are also excluded from the ModelForm used for creating and editing. Note that when specifying ModelAdmin.fields or ModelAdmin.fieldsets the read-only fields must be present to be shown (they are ignored otherwise).

If readonly_fields is used without defining explicit ordering through ModelAdmin.fields or ModelAdmin.fieldsets they will be added last after all editable fields.

A read-only field can not only display data from a model’s field, it can also display the output of a model’s method or a method of the ModelAdmin > ModelAdmin.list_display behaves. This provides an easy way to use the admin interface to provide feedback on the status of the objects being edited, for example:

Set save_as to enable a “save as new” feature on admin change forms.

Normally, objects have three save options: “Save”, “Save and continue editing”, and “Save and add another”. If save_as is True , “Save and add another” will be replaced by a “Save as new” button that creates a new object (with a new ID) rather than updating the existing object.

By default, save_as is set to False .

When save_as=True , the default redirect after saving the new object is to the change view for that object. If you set save_as_continue=False , the redirect will be to the changelist view.

By default, save_as_continue is set to True .

Set save_on_top to add save buttons across the top of your admin change forms.

Normally, the save buttons appear only at the bottom of the forms. If you set save_on_top , the buttons will appear both on the top and the bottom.

By default, save_on_top is set to False .

Set search_fields to enable a search box on the admin change list page. This should be set to a list of field names that will be searched whenever somebody submits a search query in that text box.

These fields should be some kind of text field, such as CharField or TextField . You can also perform a related lookup on a ForeignKey or ManyToManyField with the lookup API “follow” notation:

For example, if you have a blog entry with an author, the following definition would enable searching blog entries by the email address of the author:

When somebody does a search in the admin search box, Django splits the search query into words and returns all objects that contain each of the words, case-insensitive (using the icontains lookup), where each word must be in at least one of search_fields . For example, if search_fields is set to [‘first_name’, ‘last_name’] and a user searches for john lennon , Django will do the equivalent of this SQL WHERE clause:

If you don’t want to use icontains as the lookup, you can use any lookup by appending it the field. For example, you could use exact by setting search_fields to [‘first_name__exact’] .

Beware that because query terms are split and ANDed as described earlier, searching with exact only works with a single search word since two or more words can’t all be an exact match unless all words are the same.

The ability to specify a field lookup was added.

Some (older) shortcuts for specifying a field lookup are also available. You can prefix a field in search_fields with the following characters and it’s equivalent to adding __ to the field:

Prefix Lookup
^ startswith
= iexact
@ search
None icontains

If you need to customize search you can use ModelAdmin.get_search_results() to provide additional or alternate search behavior.

Set show_full_result_count to control whether the full count of objects should be displayed on a filtered admin page (e.g. 99 results (103 total) ). If this option is set to False , a text like 99 results (Show all) is displayed instead.

The default of show_full_result_count=True generates a query to perform a full count on the table which can be expensive if the table contains a large number of rows.

By default, the change list page allows sorting by all model fields (and callables that have the admin_order_field property) specified in list_display .

If you want to disable sorting for some columns, set sortable_by to a collection (e.g. list , tuple , or set ) of the subset of list_display that you want to be sortable. An empty collection disables sorting for all columns.

If you need to specify this list dynamically, implement a get_sortable_by() method instead.

Set view_on_site to control whether or not to display the “View on site” link. This link should bring you to a URL where you can display the saved object.

This value can be either a boolean flag or a callable. If True (the default), the object’s get_absolute_url() method will be used to generate the url.

If your model has a get_absolute_url() method but you don’t want the “View on site” button to appear, you only need to set view_on_site to False :

In case it is a callable, it accepts the model instance as a parameter. For example:

Custom template options¶

Path to a custom template, used by add_view() .

Path to a custom template, used by change_view() .

Path to a custom template, used by changelist_view() .

Path to a custom template, used by delete_view() for displaying a confirmation page when deleting one or more objects.

Path to a custom template, used by the delete_selected action method for displaying a confirmation page when deleting one or more objects. See the actions documentation .

Path to a custom template, used by history_view() .

ModelAdmin methods¶

When overr > ModelAdmin.save_model() and ModelAdmin.delete_model() , your code must save/delete the object. They aren’t meant for veto purposes, rather they allow you to perform extra operations.


The save_model method is given the HttpRequest , a model instance, a ModelForm instance, and a boolean value based on whether it is adding or changing the object. Overr > super().save_model() to save the object using Model.save() .

For example to attach request.user to the object prior to saving:

The delete_model method is given the HttpRequest and a model instance. Overr > super().delete_model() to delete the object using Model.delete() .

ModelAdmin. delete_queryset (request, queryset) [source] ¶

The save_formset method is given the HttpRequest , the parent ModelForm instance and a boolean value based on whether it is adding or changing the parent object.

For example, to attach request.user to each changed formset model instance:

ModelAdmin. get_ordering (request

The get_ordering method takes a request as parameter and is expected to return a list or tuple for ordering similar to the ordering attribute. For example:

The get_search_results method modifies the list of objects displayed into those that match the provided search term. It accepts the request, a queryset that applies the current filters, and the user-provided search term. It returns a tuple containing a queryset modified to implement the search, and a boolean indicating if the results may contain duplicates.

The default implementation searches the fields named in ModelAdmin.search_fields .

This method may be overr > True in the second element of the return value.

For example, to search by name and age , you could use:

This implementation is more efficient than search_fields = (‘name’, ‘=age’) which results in a string comparison for the numeric field, for example . OR UPPER(«polls_choice».»votes»::text) = UPPER(‘4’) on PostgreSQL.

The save_related method is given the HttpRequest , the parent ModelForm instance, the list of inline formsets and a boolean value based on whether the parent is being added or changed. Here you can do any pre- or post-save operations for objects related to the parent. Note that at this point the parent object and its form have already been saved.

ModelAdmin. get_autocomplete_fields (request

ModelAdmin. get_readonly_fields (request, obj=None

The get_readonly_fields method is given the HttpRequest and the obj being edited (or None on an add form) and is expected to return a list or tuple of field names that will be displayed as read-only, as described above in the ModelAdmin.readonly_fields section.

ModelAdmin. get_prepopulated_fields (request, obj=None

The get_prepopulated_fields method is given the HttpRequest and the obj being edited (or None on an add form) and is expected to return a dictionary , as described above in the ModelAdmin.prepopulated_fields section.

ModelAdmin. get_list_display (request) [source] ¶

The get_list_display method is given the HttpRequest and is expected to return a list or tuple of field names that will be displayed on the changelist view as described above in the ModelAdmin.list_display section.

ModelAdmin. get_list_display_links (request, list_display) [source] ¶

The get_list_display_links method is given the HttpRequest and the list or tuple returned by ModelAdmin.get_list_display() . It is expected to return either None or a list or tuple of field names on the changelist that will be linked to the change view, as described in the ModelAdmin.list_display_links section.

ModelAdmin. get_exclude (request, obj=None

The get_exclude method is given the HttpRequest and the obj being edited (or None on an add form) and is expected to return a list of fields, as described in ModelAdmin.exclude .

ModelAdmin. get_fields (request, obj=None

The get_fields method is given the HttpRequest and the obj being edited (or None on an add form) and is expected to return a list of fields, as described above in the ModelAdmin.fields section.

ModelAdmin. get_fieldsets (request, obj=None

The get_fieldsets method is given the HttpRequest and the obj being edited (or None on an add form) and is expected to return a list of two-tuples, in which each two-tuple represents a on the admin form page, as described above in the ModelAdmin.fieldsets section.

ModelAdmin. get_list_filter (request) [source] ¶

The get_list_filter method is given the HttpRequest and is expected to return the same kind of sequence type as for the list_filter attribute.

ModelAdmin. get_list_select_related (request) [source] ¶

The get_list_select_related method is given the HttpRequest and should return a boolean or list as ModelAdmin.list_select_related does.

ModelAdmin. get_search_fields (request) [source] ¶

The get_search_fields method is given the HttpRequest and is expected to return the same kind of sequence type as for the search_fields attribute.

ModelAdmin. get_sortable_by (request

The get_sortable_by() method is passed the HttpRequest and is expected to return a collection (e.g. list , tuple , or set ) of field names that will be sortable in the change list page.

Its default implementation returns sortable_by if it’s set, otherwise it defers to get_list_display() .

For example, to prevent one or more columns from being sortable:

The get_inline_instances method is given the HttpRequest and the obj being edited (or None on an add form) and is expected to return a list or tuple of InlineModelAdmin objects, as described below in the InlineModelAdmin section. For example, the following would return inlines without the default filtering based on add, change, delete, and view permissions:

If you overr > inlines or you might encounter a “Bad Request” error when adding related objects.

The get_urls method on a ModelAdmin returns the URLs to be used for that ModelAdmin in the same way as a URLconf. Therefore you can extend them as documented in URL dispatcher :

If you want to use the admin layout, extend from admin/base_site.html :

Notice that the custom patterns are included before the regular admin URLs: the admin URL patterns are very permissive and will match nearly anything, so you’ll usually want to prepend your custom URLs to the built-in ones.

In this example, my_view will be accessed at /admin/myapp/mymodel/my_view/ (assuming the admin URLs are included at /admin/ .)

However, the self.my_view function registered above suffers from two problems:

  • It will not perform any permission checks, so it will be accessible to the general public.
  • It will not provide any header details to prevent caching. This means if the page retrieves data from the database, and caching middleware is active, the page could show outdated information.

Since this is usually not what you want, Django prov > AdminSite.admin_view() (i.e. self.admin_site.admin_view ins > ModelAdmin instance); use it like so:

Notice the wrapped view in the fifth line above:

This wrapping will protect self.my_view from unauthorized access and will apply the django.views.decorators.cache.never_cache() decorator to make sure it is not cached if the cache middleware is active.

If the page is cacheable, but you still want the permission check to be performed, you can pass a cacheable=True argument to AdminSite.admin_view() :

ModelAdmin views have model_admin attributes. Other AdminSite views have admin_site attributes.

The base implementation uses modelform_factory() to sub > form , modified by attributes such as fields and exclude . So, for example, if you wanted to offer additional fields to superusers, you could swap in a different base form like so:

You may also simply return a custom ModelForm class directly.

ModelAdmin. get_formsets_with_inlines (request, obj=None) [source] ¶

Yields ( FormSet , InlineModelAdmin ) pairs for use in admin add and change views.

For example if you wanted to display a particular inline only in the change view, you could overr > get_formsets_with_inlines as follows:

The formfield_for_foreignkey method on a ModelAdmin allows you to override the default formfield for a foreign keys field. For example, to return a subset of objects for this foreign key field based on the user:

This uses the HttpRequest instance to filter the Car foreign key field to only display the cars owned by the User instance.

ModelAdmin. formfield_for_manytomany (db_field, request, **kwargs

Like the formfield_for_foreignkey method, the formfield_for_manytomany method can be overr > Car foreign key field to only display the cars owned by the User :

Like the formfield_for_foreignkey and formfield_for_manytomany methods, the formfield_for_choice_field method can be overridden to change the default formfield for a field that has declared choices. For example, if the choices available to a superuser should be different than those available to regular staff, you could proceed as follows:

Returns the Changelist > django.contrib.admin.views.main.ChangeList is used. By inheriting this class you can change the behavior of the listing.

ModelAdmin. get_changelist_form (request, **kwargs) [source] ¶

Returns a ModelForm > Formset on the changelist page. To use a custom form, for example:

Returns a ModelFormSet > list_editable is used. To use a custom formset, for example:

The objects in the changelist page can be filtered with lookups from the URL’s query string. This is how list_filter works, for example. The lookups are similar to what’s used in QuerySet.filter() (e.g. user__email=user@example.com ). Since the lookups in the query string can be manipulated by the user, they must be sanitized to prevent unauthorized data exposure.

By default, lookup_allowed() allows access to a model’s local fields, field paths used in list_filter (but not paths from get_list_filter() ), and lookups required for limit_choices_to to function correctly in raw_id_fields .

ModelAdmin. has_view_permission (request, obj=None

Should return True if viewing obj is permitted, False otherwise. If obj is None , should return True or False to indicate whether viewing of objects of this type is permitted in general (e.g., False will be interpreted as meaning that the current user is not permitted to view any object of this type).

The default implementation returns True if the user has either the “change” or “view” permission.

ModelAdmin. has_add_permission (request

Should return True if adding an object is permitted, False otherwise.

ModelAdmin. has_change_permission (request, obj=None

Should return True if editing obj is permitted, False otherwise. If obj is None , should return True or False to indicate whether editing of objects of this type is permitted in general (e.g., False will be interpreted as meaning that the current user is not permitted to edit any object of this type).

ModelAdmin. has_delete_permission (request, obj=None

Should return True if deleting obj is permitted, False otherwise. If obj is None , should return True or False to indicate whether deleting objects of this type is permitted in general (e.g., False will be interpreted as meaning that the current user is not permitted to delete any object of this type).

ModelAdmin. has_module_permission (request

ModelAdmin. get_queryset (request

The get_queryset method on a ModelAdmin returns a QuerySet of all model instances that can be edited by the admin site. One use case for overriding this method is to show objects owned by the logged-in user:

Sends a message to the user using the django.contrib.messages backend. See the custom ModelAdmin example .

Keyword arguments allow you to change the message level, add extra CSS tags, or fail silently if the contrib.messages framework is not installed. These keyword arguments match those for django.contrib.messages.add_message() , see that function’s documentation for more details. One difference is that the level may be passed as a string label in addition to integer/constant.

ModelAdmin. get_paginator (request, queryset, per_page, orphans=0, allow_empty_first_page=True) [source] ¶

Returns an instance of the paginator to use for this view. By default, instantiates an instance of paginator .

ModelAdmin. response_add (request, obj, post_url_continue=None) [source] ¶

Determines the HttpResponse for the add_view() stage.

response_add is called after the admin form is submitted and just after the object and all the related instances have been created and saved. You can override it to change the default behavior after the object has been created.

ModelAdmin. response_change (request, obj) [source] ¶

Determines the HttpResponse for the change_view() stage.

response_change is called after the admin form is submitted and just after the object and all the related instances have been saved. You can override it to change the default behavior after the object has been changed.

Determines the HttpResponse for the delete_view() stage.

response_delete is called after the object has been deleted. You can override it to change the default behavior after the object has been deleted.

obj_display is a string with the name of the deleted object.

obj_id is the serialized identifier used to retrieve the object to be deleted.

ModelAdmin. get_changeform_initial_data (request) [source] ¶

A hook for the initial data on admin change forms. By default, fields are given initial values from GET parameters. For instance, ?name=initial_value will set the name field’s initial value to be initial_value .

This method should return a dictionary in the form <'fieldname': 'fieldval'>:

A hook for customizing the deletion process of the delete_view() and the “delete selected” action .

The objs argument is a homogeneous iterable of objects (a QuerySet or a list of model instances) to be deleted, and request is the HttpRequest .

This method must return a 4-tuple of (deleted_objects, model_count, perms_needed, protected) .

deleted_objects is a list of strings representing all the objects that will be deleted. If there are any related objects to be deleted, the list is nested and includes those related objects. The list is formatted in the template using the unordered_list filter.

model_count is a dictionary mapping each model’s verbose_name_plural to the number of objects that will be deleted.

perms_needed is a set of verbose_name s of the models that the user doesn’t have permission to delete.

protected is a list of strings representing of all the protected related objects that can’t be deleted. The list is displayed in the template.

Other methods¶

Django view for the model instance addition page. See note below.

Django view for the model instance editing page. See note below.

ModelAdmin. changelist_view (request, extra_context=None) [source] ¶

Django view for the model instances change list/actions page. See note below.

Django view for the model instance(s) deletion confirmation page. See note below.

Django view for the page that shows the modification history for a given model instance.

Unlike the hook-type ModelAdmin methods detailed in the previous section, these five methods are in reality designed to be invoked as Django views from the admin application URL dispatching handler to render the pages that deal with model instances CRUD operations. As a result, completely overriding these methods will significantly change the behavior of the admin application.

One common reason for overriding these methods is to augment the context data that is provided to the template that renders the view. In the following example, the change view is overridden so that the rendered template is provided some extra mapping data that would not otherwise be available:

These views return TemplateResponse instances which allow you to easily customize the response data before rendering. For more details, see the TemplateResponse documentation .

ModelAdmin asset definitions¶

There are times where you would like add a bit of CSS and/or JavaScript to the add/change views. This can be accomplished by using a Media inner > ModelAdmin :

The staticfiles app prepends STATIC_URL (or MEDIA_URL if STATIC_URL is None ) to any asset paths. The same rules apply as regular asset definitions on forms .

jQuery¶

Django admin JavaScript makes use of the jQuery library.

To avo > django.jQuery . If you want to use jQuery in your own admin JavaScript without including a second copy, you can use the django.jQuery object on changelist and add/edit views.

jQuery was upgraded from 2.2.3 to 3.3.1.

The ModelAdmin > ModelAdmin ’s list of media resources unless you have a specific need. For example, if you require the jQuery library to be in the global namespace (for example when using third-party jQuery plugins) or if you need a newer version of jQuery, you will have to include your own copy.

Django prov > jquery.js and jquery.min.js respectively.

ModelAdmin and InlineModelAdmin have a media property that returns a list of Media objects which store paths to the JavaScript files for the forms and/or formsets. If DEBUG is True it will return the uncompressed versions of the various JavaScript files, including jquery.js ; if not, it will return the ‘minified’ versions.

Adding custom validation to the admin¶

Adding custom val > django.forms , and the ModelAdmin class gives you the ability define your own form:

MyArticleAdminForm can be defined anywhere as long as you import where needed. Now within your form you can add your own custom validation for any field:

It is important you use a ModelForm here otherwise things can break. See the forms documentation on custom validation and, more specifically, the model form validation notes for more information.

InlineModelAdmin objects¶

The admin interface has the ability to edit models on the same page as a parent model. These are called inlines. Suppose you have these two models:

You can edit the books authored by an author on the author page. You add inlines to a model by specifying them in a ModelAdmin.inlines :

Django prov > InlineModelAdmin and they are:

The difference between these two is merely the template used to render them.

InlineModelAdmin options¶

InlineModelAdmin shares many of the same features as ModelAdmin , and adds some of its own (the shared features are actually defined in the BaseModelAdmin superclass). The shared features are:

The InlineModelAdmin class adds or customizes:

The model which the inline is using. This is required.

The name of the foreign key on the model. In most cases this will be dealt with automatically, but fk_name must be specified explicitly if there are more than one foreign key to the same parent model.

This defaults to BaseInlineFormSet . Using your own formset can give you many possibilities of customization. Inlines are built around model formsets .

The value for form defaults to ModelForm . This is what is passed through to inlineformset_factory() when creating the formset for this inline.

A list or tuple containing extra CSS > None . As with > fieldsets , inlines with a collapse class will be initially collapsed and their header will have a small “show” link.

This controls the number of extra forms the formset will display in addition to the initial forms. See the formsets documentation for more information.

For users with JavaScript-enabled browsers, an “Add another” link is prov > extra argument.

The dynamic link will not appear if the number of currently displayed forms exceeds max_num , or if the user does not have JavaScript enabled.

InlineModelAdmin.get_extra() also allows you to customize the number of extra forms.

This controls the maximum number of forms to show in the inline. This doesn’t directly correlate to the number of objects, but can if the value is small enough. See Limiting the number of editable objects for more information.

InlineModelAdmin.get_max_num() also allows you to customize the maximum number of extra forms.

This controls the minimum number of forms to show in the inline. See modelformset_factory() for more information.

InlineModelAdmin.get_min_num() also allows you to customize the minimum number of displayed forms.

By default, Django’s admin uses a select-box interface ( ) for fields that are ForeignKey . Sometimes you don’t want to incur the overhead of having to select all the related instances to display in the drop-down.

raw_id_fields is a list of fields you would like to change into an Input w > ForeignKey or ManyToManyField :

The template used to render the inline on the page.

An overr > verbose_name found in the model’s inner Meta class.

An overr > verbose_name_plural found in the model’s inner Meta class.

Specifies whether or not inline objects can be deleted in the inline. Defaults to True .

Specifies whether or not inline objects that can be changed in the admin have a link to the change form. Defaults to False .

InlineModelAdmin. get_formset (request, obj=None, **kwargs

Returns a BaseInlineFormSet > obj is the parent object being edited or None when adding a new parent. See the example for ModelAdmin.get_formsets_with_inlines .

InlineModelAdmin. get_extra (request, obj=None, **kwargs

Returns the number of extra inline forms to use. By default, returns the InlineModelAdmin.extra attribute.

Returns the maximum number of extra inline forms to use. By default, returns the InlineModelAdmin.max_num attribute.

Returns the minimum number of inline forms to use. By default, returns the InlineModelAdmin.min_num attribute.

InlineModelAdmin. has_add_permission (request, obj

Should return True if adding an inline object is permitted, False otherwise. obj is the parent object being edited or None when adding a new parent.

The obj argument was added. During the deprecation period, it may also be None if third-party calls to has_add_permission() don’t provide it.

Should return True if editing an inline object is permitted, False otherwise. obj is the parent object being edited.

InlineModelAdmin. has_delete_permission (request, obj=None

Should return True if deleting an inline object is permitted, False otherwise. obj is the parent object being edited.

The obj argument passed to InlineModelAdmin methods is the parent object being edited or None when adding a new parent.

Working with a model with two or more foreign keys to the same parent model¶

It is sometimes possible to have more than one foreign key to the same model. Take this model for instance:

If you wanted to display an inline on the Person admin add/change pages you need to explicitly define the foreign key since it is unable to do so automatically:

Working with many-to-many models¶

By default, admin w > ManyToManyField . Depending on your ModelAdmin definition, each many-to-many field in your model will be represented by a standard HTML multiple> , a horizontal or vertical filter, or a raw_id_admin widget. However, it is also possible to replace these widgets with inlines.

Suppose we have the following models:

If you want to display many-to-many relations using an inline, you can do so by defining an InlineModelAdmin object for the relationship:

There are two features worth noting in this example.

Firstly — the MembershipInline > Group.members.through . The through attribute is a reference to the model that manages the many-to-many relation. This model is automatically created by Django when you define a many-to-many field.

Secondly, the GroupAdmin must manually exclude the members field. Django displays an admin w > Group ). If you want to use an inline model to represent the many-to-many relationship, you must tell Django’s admin to not display this widget — otherwise you will end up with two widgets on your admin page for managing the relation.

Note that when using this technique the m2m_changed signals aren’t triggered. This is because as far as the admin is concerned, through is just a model with two foreign key fields rather than a many-to-many relation.

In all other respects, the InlineModelAdmin is exactly the same as any other. You can customize the appearance using any of the normal ModelAdmin properties.

Working with many-to-many intermediary models¶

When you specify an intermediary model using the through argument to a ManyToManyField , the admin will not display a widget by default. This is because each instance of that intermediary model requires more information than could be displayed in a single widget, and the layout required for multiple widgets will vary depending on the intermediate model.

However, we still want to be able to edit that information inline. Fortunately, this is easy to do with inline admin models. Suppose we have the following models:

The first step in displaying this intermediate model in the admin is to define an inline > Membership model:

This simple example uses the default InlineModelAdmin values for the Membership model, and limits the extra add forms to one. This could be customized using any of the options available to InlineModelAdmin classes.

Now create admin views for the Person and Group models:

Finally, register your Person and Group models with the admin site:

Now your admin site is set up to edit Membership objects inline from either the Person or the Group detail pages.

Using generic relations as an inline¶

It is possible to use an inline with generically related objects. Let’s say you have the following models:

If you want to allow editing and creating an Image instance on the Product , add/change views you can use GenericTabularInline or GenericStackedInline (both sub > GenericInlineModelAdmin ) prov > admin . They implement tabular and stacked visual layouts for the forms representing the inline objects, respectively, just like their non-generic counterparts. They behave just like any other inline. In your admin.py for this example app:

See the contenttypes documentation for more specific information.

Overriding admin templates¶

It is relatively easy to override many of the templates which the admin module uses to generate the various pages of an admin site. You can even override a few of these templates for a specific app, or a specific model.

Set up your projects admin template directories¶

The admin template files are located in the contrib/admin/templates/admin directory.

In order to overr > admin directory in your project’s templates directory. This can be any of the directories you specified in the DIRS option of the DjangoTemplates backend in the TEMPLATES setting. If you have customized the ‘loaders’ option, be sure ‘django.template.loaders.filesystem.Loader’ appears before ‘django.template.loaders.app_directories.Loader’ so that your custom templates will be found by the template loading system before those that are included with django.contrib.admin .

Within this admin directory, create sub-directories named after your app. Within these app subdirectories create sub-directories named after your models. Note, that the admin app will lowercase the model name when looking for the directory, so make sure you name the directory in all lowercase if you are going to run your app on a case-sensitive filesystem.

To overr > django/contrib/admin/templates/admin directory, and save it to one of the directories you just created.

For example, if we wanted to add a tool to the change list view for all the models in an app named my_app , we would copy contrib/admin/templates/admin/change_list.html to the templates/admin/my_app/ directory of our project, and make any necessary changes.

If we wanted to add a tool to the change list view for only a specific model named ‘Page’, we would copy that same file to the templates/admin/my_app/page directory of our project.

Overriding vs. replacing an admin template¶

Because of the modular design of the admin templates, it is usually neither necessary nor advisable to replace an entire template. It is almost always better to override only the section of the template which you need to change.

To continue the example above, we want to add a new link next to the History tool for the Page model. After looking at change_form.html we determine that we only need to overr > object-tools-items block. Therefore here is our new change_form.html :

And that’s it! If we placed this file in the templates/admin/my_app directory, our link would appear on the change form for all models within my_app.

Templates which may be overridden per app or model¶

Not every template in contrib/admin/templates/admin may be overridden per app or per model. The following can:

  • actions.html
  • app_index.html
  • change_form.html
  • change_form_object_tools.html
  • change_list.html
  • change_list_object_tools.html
  • change_list_results.html
  • date_hierarchy.html
  • delete_confirmation.html
  • object_history.html
  • pagination.html
  • popup_response.html
  • prepopulated_fields_js.html
  • search_form.html
  • submit_line.html

The ability to overr > actions.html , change_form_object_tools.html , change_list_object_tools.html , change_list_results.html , date_hierarchy.html , pagination.html , prepopulated_fields_js.html , search_form.html , and submit_line.html templates was added.

For those templates that cannot be overr > templates/admin directory. This is particularly useful to create custom 404 and 500 pages.

Some of the admin templates, such as change_list_results.html are used to render custom inclusion tags. These may be overridden, but in such cases you are probably better off creating your own version of the tag in question and giving it a different name. That way you can use it selectively.

Root and login templates¶

If you wish to change the index, login or logout templates, you are better off creating your own AdminSite instance (see below), and changing the AdminSite.index_template , AdminSite.login_template or AdminSite.logout_template properties.

AdminSite objects¶

A Django administrative site is represented by an instance of django.contrib.admin.sites.AdminSite ; by default, an instance of this > django.contrib.admin.site and you can register your models and ModelAdmin instances with it.

If you want to customize the default admin site, you can override it .


AdminSite attributes¶

The text to put at the top of each admin page, as an

(a string). By default, this is “Django administration”.

The text to put at the end of each admin page’s (a string). By default, this is “Django site admin”.

The URL for the “View site” link at the top of each admin page. By default, site_url is / . Set it to None to remove the link.

For sites running on a subpath, the each_context() method checks if the current request has request.META[‘SCRIPT_NAME’] set and uses that value if site_url isn’t set to something other than / .

The text to put at the top of the admin index page (a string). By default, this is “Site administration”.

Path to a custom template that will be used by the admin site main index view.

Path to a custom template that will be used by the admin site app index view.

The string to use for displaying empty values in the admin site’s change list. Defaults to a dash. The value can also be overr > ModelAdmin basis and on a custom field within a ModelAdmin by setting an empty_value_display attribute on the field. See ModelAdmin.empty_value_display for examples.

Path to a custom template that will be used by the admin site login view.

Sub > AuthenticationForm that will be used by the admin site login view.

Path to a custom template that will be used by the admin site logout view.

Path to a custom template that will be used by the admin site password change view.

Path to a custom template that will be used by the admin site password change done view.

AdminSite methods¶

Returns a dictionary of variables to put in the template context for every page in the admin site.

Includes the following variables and values by default:

available_apps : a list of applications from the application registry available for the current user. Each entry in the list is a dict representing an application with the following keys:

  • app_label : the application label
  • app_url : the URL of the application index in the admin
  • has_module_perms : a boolean indicating if displaying and accessing of the module’s index page is permitted for the current user
  • models : a list of the models available in the application

Each model is a dict with the following keys:

  • object_name : > name : plural name of the model
  • perms : a dict tracking add , change , delete , and view permissions
  • admin_url : admin changelist URL for the model
  • add_url : admin URL to add a new model instance

AdminSite. has_permission (request) [source]¶

Returns True if the user for the given HttpRequest has permission to view at least one page in the admin site. Defaults to requiring both User.is_active and User.is_staff to be True .

Registers the given model > admin_class . admin_class defaults to ModelAdmin (the default admin options). If keyword arguments are given – e.g. list_display – they’ll be applied as options to the admin class.

Raises ImproperlyConfigured if a model is abstract. and django.contrib.admin.sites.AlreadyRegistered if a model is already registered.

Hooking AdminSite instances into your URLconf¶

The last step in setting up the Django admin is to hook your AdminSite instance into your URLconf. Do this by pointing a given URL at the AdminSite.urls method. It is not necessary to use include() .

In this example, we register the default AdminSite instance django.contrib.admin.site at the URL /admin/

Customizing the AdminSite class¶

If you’d like to set up your own admin site with custom behavior, you’re free to sub > AdminSite and overr > AdminSite sub > ModelAdmin sub > myproject/urls.py to reference your AdminSite subclass.

Note that you may not want autodiscovery of admin modules when using your own AdminSite instance since you will likely be importing all the per-app admin modules in your myproject.admin module. This means you need to put ‘django.contrib.admin.apps.SimpleAdminConfig’ instead of ‘django.contrib.admin’ in your INSTALLED_APPS setting.

Overr > New in Django 2.1:

You can overr > django.contrib.admin.site by setting the default_site attribute of a custom AppConfig to the dotted import path of either a AdminSite subclass or a callable that returns a site instance.

Multiple admin sites in the same URLconf¶

It’s easy to create multiple instances of the admin site on the same Django-powered website. Just create multiple instances of AdminSite and root each one at a different URL.

In this example, the URLs /basic-admin/ and /advanced-admin/ feature separate versions of the admin site – using the AdminSite instances myproject.admin.basic_site and myproject.admin.advanced_site , respectively:

AdminSite instances take a single argument to their constructor, their name, which can be anything you like. This argument becomes the prefix to the URL names for the purposes of reversing them . This is only necessary if you are using more than one AdminSite .

Adding views to admin sites¶

Just like ModelAdmin , AdminSite prov > get_urls() method that can be overr > get_urls() method to include a pattern for your new view.

Any view you render that uses the admin templates, or extends the base admin template, should set request.current_app before rendering the template. It should be set to either self.name if your view is on an AdminSite or self.admin_site.name if your view is on a ModelAdmin .

Adding a password reset feature¶

You can add a password reset feature to the admin site by adding a few lines to your URLconf. Specifically, add these four patterns:

(This assumes you’ve added the admin at admin/ and requires that you put the URLs starting with ^admin/ before the line that includes the admin app itself).

The presence of the admin_password_reset named URL will cause a “forgotten your password?” link to appear on the default admin log-in page under the password box.

LogEntry objects¶

The LogEntry class tracks additions, changes, and deletions of objects done through the admin interface.

LogEntry attributes¶

The date and time of the action.

The user (an AUTH_USER_MODEL instance) who performed the action.

The ContentType of the modified object.

The textual representation of the modified object’s primary key.

The object`s repr() after the modification.

The type of action logged: ADDITION , CHANGE , DELETION .

For example, to get a list of all additions done through the admin:

The detailed description of the modification. In the case of an edit, for example, the message contains a list of the edited fields. The Django admin site formats this content as a JSON structure, so that get_change_message() can recompose a message translated in the current user language. Custom code might set this as a plain string though. You are advised to use the get_change_message() method to retrieve this value instead of accessing it directly.

LogEntry methods¶

A shortcut that returns the referenced object.

Formats and translates change_message into the current user language. Messages created before Django 1.10 will always be displayed in the language in which they were logged.

Reversing admin URLs¶

The AdminSite provides the following named URL patterns:

Page URL name Parameters
Index index
Login login
Logout logout
Password change password_change
Password change done password_change_done
i18n JavaScript jsi18n
Application index page app_list app_label
Redirect to object’s page view_on_site content_type_id , object_id

Each ModelAdmin instance provides an additional set of named URLs:

Page URL name Parameters
Changelist << app_label >>_<< model_name >>_changelist
Add << app_label >>_<< model_name >>_add
History << app_label >>_<< model_name >>_history object_id
Delete << app_label >>_<< model_name >>_delete object_id
Change << app_label >>_<< model_name >>_change object_id

The UserAdmin provides a named URL:

Page URL name Parameters
Password change auth_user_password_change user_id

These named URLs are registered with the application namespace admin , and with an instance namespace corresponding to the name of the Site instance.

So — if you wanted to get a reference to the Change view for a particular Choice object (from the polls application) in the default admin, you would call:

This will find the first registered instance of the admin application (whatever the instance name), and resolve to the view for changing poll.Choice instances in that instance.

If you want to find a URL in a specific admin instance, prov > current_app hint to the reverse call. For example, if you specifically wanted the admin view from the admin instance named custom , you would need to call:

For more details, see the documentation on reversing namespaced URLs .

To allow easier reversing of the admin urls in templates, Django prov > admin_urlname filter which takes an action as argument:

The action in the examples above match the last part of the URL names for ModelAdmin instances described above. The opts variable can be any object which has an app_label and model_name attributes and is usually supplied by the admin views for the current model.

The staff_member_required decorator¶

This decorator is used on the admin views that require authorization. A view decorated with this function will having the following behavior:

Ваше первое Django-приложение, часть 2

Начнём с того места, где мы остановились в первой части. Мы продолжаем приложение Web-опроса и сосредоточимся теперь на автоматически-генерируемом интерфейсе администратора Django-сайта.

Философия

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

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

Интерфейс администратора сайта создан для менеджеров, поэтому посетителям сайта не следует им пользоваться.

Активирование интерфейса администратора сайта

Интерфейс администратора сайта Django не активирован по умолчанию — это опция. Для его активации сделайте следующие три шага:

запустите python manage.py syncdb . Если Вы добавляете новое приложение в INSTALLED_APPS , то после этого необходимо обновить таблицы баз данных.

  • измените файл mysite/urls.py и разкомментируйте строки, на которые администратору указывают, что их необходимо разкомментировать. Это файл — URLconf; мы рассмотрим его в следующем руководстве. Пока, все, что нам нужно знать о нём — это то, что он отображает соответствие корней URL приложениям. В итоге ваш файл urls.py должен выглядеть следующим образом:

Метод добавления URL интерфейса администратора, изменённого в Django 1.1.

(Строки в полужирном начертании необходимо разкомментировать.)

Запуск сервера разработки

Давайте запустим сервер разработки и исследуем интерфейс администратора сайта.

Вспомним 1 часть руководства и запустим сервер разработки следующим образом:

Теперь, откройте Web-браузер и зайдите в «/admin/» на своём локальном домене, например, http://127.0.0.1:8000/admin/. Вы увидите следующее окно:

Вход в интерфейс администратора сайта

Теперь заходим. (Если Вы помните, мы создали учётную запись суперпользователя в первой части руководства? Если Вы не создали или забыли пароль, то Вы можете создать другую.)Вы должны увидеть главную страницу Django:

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

Сделаем приложение опроса редактируемым в интерфейсе администратора

Но где наше приложение опроса? Оно не отображено на главной странице.

Надо сделать лишь одну вещь — сообщить интерфейсу администратора, что объекты Poll имеют интерфейс администратора. Чтобы это сделать, создайте файл admin.py в каталоге polls и измените его следующим образом:

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

Узнаем о функциональных возможностях интерфейса администратора

Теперь, когда мы зарегистрировали Poll , Django знает, что он должен быть отображён на главной странице:

Нажмите кнопку «Polls». Теперь Вы находитесь на странице «change list» для опросов. Эта страница отображает все опросы в базе данных и позволяет Вам выбрать необходимый для внесения изменений. Здесь есть опрос «What’s up? «, который мы создали в первой части руководства:

Нажмите на опрос «What’s up? «, чтобы внести в него изменения:

Форма автоматически генерируется из модели Poll.

Различные типы полей в модели ( DateTimeField , CharField ) соответствуют определённому виджету HTML-ввода. Каждый тип поля знает, как отображаться в интерфейсе администратора Django.

Каждый DateTimeField получает свободные ярлыки JavaScript. «Даты» получают ярлык «Today» и всплывающий календарь, а «Время» получает ярлык «Now» и удобное выпадающее окно, которое содержит часто вводимые значения времени.

Нижняя часть страницы предоставляет пару опций:

сохранить — сохраняет изменения и возвращается к странице change-list для этого типа объекта.

сохранить и продолжить редактирование — сохраняет изменения и перезагружает страницу интерфейса администратора для этого объекта.

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

удалить — отображает страницу подтверждения удаления.

Измените «Date published», щёлкнув по кнопке «Today» и «Now». Затем щёлкните по кнопке «Сохранить и продолжить редактирование. После этого нажмите кнопку «History» в верхнем правом углу. Вы увидите страницу, отображающую список всех изменений, которым подвергся данный объект через интерфейс администратора Django, отображая время и имя пользователя человека, который внёс изменения:

Настройка формы интерфейса администратора

Разве Вы не удивлены тому количеству кода, который вам не пришлось писать! Регистрируя модель Poll с помощью admin.site.register(Poll) , Django способен создать заданную по умолчанию форму-презентацию. Часто, у вас может возникнуть желание настроить внешний вид и работу формы интерфейса администратора. Вы можете это сделать, выбрав те опции Django, которые вам нужны при регистрирации объекта.

Давайте посмотрим как это работает, изменив порядок полей в форме редактирования. Замените строку admin.site.register(Poll) на:

Далее в том же стиле — создадим модель объекта интерфейса администратора и передадим его как второй аргумент в admin.site.register() — в любое время, когда необходимо изменить настройки интерфейс администратора для объекта.

Это изменение расположит поле «Publication date» перед полем «Question»:

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

К тому же, при наличии форм с множеством полей, у вас может возникнуть желание разделить форму на fieldsets:

Первый элемент каждого кортежа в fieldsets является заголовком fieldset. Вот как теперь выглядит наша форма:

Вы можете присвоить любые HTML-классы каждому fieldset. Django предоставляет класс «collapse», который отображает по умолчанию определенные fieldset свернутыми. Это полезно, когда у вас длинная форма, которая содержит много полей, которые обычно не используются:

Добавление соответствующих объектов

OK, страница интерфейса администратора опроса у нас уже есть. Но приложение Poll имеет несколько Choices , и наша страница не отображает их, пока.

Есть два пути решения этой проблемы. Первый, зарегистрировать Choice в интерфейсе администратора также, как мы это делали с Poll . Это легко:

Теперь «Choices» — доступная опция в интерфейсе администратора Django. Форма «Add choice» выглядит так:

В этой форме, поле «Poll» имеет возможность выбора, содержащий все опросы в базе данных. Django знает, что ForeignKey должен быть представлен в интерфейсе администратора, как селективное поле. В нашем случае только один опрос существует в этом поле.

Также обратите внимание, что рядом с полем «Poll» находится ссылка «Add Another» (Добавить другой). Каждый объект с ForeignKey имеет такую ссылку. Если Вы нажмёте на кнопку «Add Another, то появится новое всплывающее окно с формой: «Добавить опрос». Если Вы добавите опрос в этом окне и щёлкните по кнопке «Сохранить», то Django сохранит данный опрос в базе данных и добавит его в форму выбора «Add choice».

Но, честно говоря это неэффективный способ добавления объекта Choice. Было бы лучше, если бы Вы могли добавить сразу несколько выборных вариантов напрямую при создании объекта Poll. Давайте так сделаем и посмотрим, что получится.

Удалите вызов register() в модели Choice. Затем измените код регистрации Poll вот таким образом:

Это сообщит Django: «объекты Choice должны редактироваться на странице интерфейса администратора Poll. По умолчанию, достаточно выводить 3 строчки. «

Загрузите страницу «Add poll», чтобы узнать как это выглядит:

Это работает так: есть три слота для Choices — как определено в extra — и каждый раз, когда Вы возвращаетесь на страницу «Изменить» для уже созданного объекта, Вы получаете три дополнительных слота.

Хотя, есть одна небольшая проблема. Требуется много экранного места для отображения всех полей соответствующих объектов Choice. По этой причине, Django предлагает табличный способ отображения объектов; вам лишь надо заменить описание ChoiceInline на:

С помощью TabularInline (вместо StackedInline ), соответствующие объекты будут отображаться в более компактном табличном формате:

Настройка change list

Теперь, когда страница интерфейса администратора Poll выглядит хорошо, давайте настроим страницу «change list» — ту, которая отображает все опросы в системе.

Вот как она выглядит:

По умолчанию, Django отображает str() каждого объекта. Но иногда было бы более полезным, если бы мы могли отобразить определенные поля. Чтобы это сделать, используйте опцию интерфейса администратора list_display которая является кортежем имен полей, которые необходимо отобразить как колонки на странице change list для объекта:

Просто в качестве хорошего тона, давайте также добавим метод was_published_today из 1 части данного руководства:

Теперь страница change list выглядит следующим образом:

Вы можете кликнуть на заголовки колонок для сортировки по ним — кроме заголовка was_published_today потому что сортировка по пользовательским методам не поддерживается. Также обратите внимание, что заголовок столбца was_published_today по умолчанию, совпадает с названием метода (подчеркивания заменяются на пробелы). Но Вы можете изменить это, задав методу (в файле models.py ) атрибут short_description :

Давайте ещё немного улучшим страницу Poll change: Фильтры. Добавьте следующую строку к PollAdmin :

Это добавит панель «Фильтр», что позволит людям фильтровать change list по полю pub_date :

Тип отображаемого фильтра зависит от типа поля, по которому Вы фильтруете. Поскольку pub_date является DateTimeField, то Django предоставляет по умолчанию следующие варианты фильтров для DateTimeFields: «Any date,» «Today,» «Past 7 days,» «This month,» и «This year».

Это хорошо. Давайте добавим теперь возможность поиска:

Это добавит строку поиска наверху change list. Когда кто — то вводит информацию для поиска, Django ищет это в поле question. Вы можете использовать столько полей, сколько Вы захотите — но из-за того, что для поиска используется LIKE не загружайте слишком сильно вашу базу данных.

И наконец, из-за того, что Poll-объекты имеют даты, было бы удобно разделить их по датам. Добавьте следующую строку:

Это добавит иерархическое расположение по времени наверху страницы change list. На верхнем уровне, отображаются все доступные годы. Затем вниз идут месяцы, и в конце дни.

Обратите также внимание на то, что change lists дают вам постраничную навигацию. По умолчанию отображается 50 элементов на странице. Постраничная навигация Change-list, строки поиска, фильтры, упорядочивание по дате и названию столбца, всё вместе работает так, как надо.

Настройка внешнего вида интерфейса администратора

Очевидно, что надпись «Django administration» в верхней части каждой страницы интерфейса администратора выглядит смешно.

Это легко исправить, используя систему шаблонов Django. Интерфейс администратора Django написан на Django и использует собственную систему шаблонов Django)

Откройте файл настройки параметров ( mysite/settings.py ) и взгляните на TEMPLATE_DIRS . TEMPLATE_DIRS является кортежем каталогов файловой системы для проверки при загрузке шаблонов Django. Он также является путём поиска файлов.

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

Теперь скопируйте шаблон admin/base_site.html из стандартного каталога шаблонов интерфейса администратора Django ( django/contrib/admin/templates ) в подкаталог admin любого каталога, который Вы используете в TEMPLATE_DIRS . Например, если TEMPLATE_DIRS включает «/home/my_username/mytemplates» , как было сказано выше, то скопируйте django/contrib/admin/templates/admin/base_site.html в /home/my_username/mytemplates/admin/base_site.html . Не забудьте про подкаталог admin .

Затем, отредактируйте файл и замените стандартный текст Django собственным низванием на свой вкус.

Этот файл шаблона содержит много такого текста, как и << title >>. Теги « <% и << являются частью языка шаблона Django. Когда Django выполняет admin/base_site.html , то этот язык шаблона будет влиять на создание конечной HTML-страницы. Не волнуйтесь, если Вы не поняли, что делать с шаблоном на данном этапе, мы рассмотрим эту тему позже в 3 части.

Обратите внимание, что стандартные шаблоны интерфейса администратора Django могут быть заменены. Чтобы заменить шаблон, просто проделайте то же самое, что и с base_site.html — скопируйте его из стандартного каталога в свой и внесите изменения.

Проницательные читатели спросят: Но если TEMPLATE_DIRS пуст по умолчанию, то как тогда Django находил заданные по умолчанию шаблоны интерфейса администратора? Ответ один: по умолчанию, Django автоматически ищет подкаталог templates/ в каждом пакете приложений, для использования в качестве резерва. Для получения полной информации см. template loader documentation.

Настройка стартовой страницы интерфейса администратора

У вас может возникнуть желание изменить стартовую страницу интерфейса администратора Django.

По умолчанию, она отображает все приложения в INSTALLED_APPS которые были зарегистрированы в качестве приложений интерфейса администратора, в алфавитном порядке. У вас может возникнуть желание внести существенные изменения в расположение страницы. В конце концов, стартовая страница — это наверное самая важная страница интерфейса администратора, и она должна быть удобна для пользования.

Выпуск Django 2.0

Команда Django анонсировала выпуск Django 2.0

Этот выпуск начинается с использования в Django свободной формы семантического управления версиями, но нет существенных изменений в обратной совместимости (за исключением того, что был удалён Python 2.7), что было ожидаемым в выпуске 2.0. Обновление должно быть таким же, как и для предыдущих выпусков.

Примечания к выпуску

Совместимость с Python

Django 2.0 поддерживает следующие версии Python: 3.4, 3.5 и 3.6. Разработчики Django настоятельно рекомендуют именно эти версии и официально поддерживают только последнии версии данных версионных серий Python.

Django 1.11.x является последней версией, которая поддерживает Python 2.7

Django 2.0 станет последней версией с поддержкой Python 3.4. Если вы планируете развертывание Python 3.4 до конца срока службы для Django 2.0 (апрель 2020 года), то используйте Django 1.11 LTS (поддерживаемый до апреля 2020 года). Обратите внимание, однако, что конец поддержки Python 3.4 — конец марта 2020 года.

Поддержка третьесторонних библиотек для старых версий Django

После выпуска Django 2.0 Разработчики предлагают сторонним разработчикам приложений отказаться от поддержки всех версий Django до 1.11. В тоже время разработчики должны иметь возможность запускать тесты своего пакета с помощью python -Wd , чтобы отображались предупреждения об ошибках. После внесения исправлений для предупреждения об ошибке приложение должно быть совместимо с Django 2.0.

Что нового в Django 2.0?

Упрощенный синтаксис маршрутизации URL-адресов

Новая функция django.urls.path() позволяет упростить синтаксис url-адресов, и сделать его более читаемым. Например, этот пример из предыдущих выпусков Django:

Может быть написан следующим образом

Новый синтаксис поддерживает тип принуждения параметров URL. В этом примере представление будет принимать аргумент ключевого слова year как целое число, а не как строку. Кроме того, URL-адреса не будут теперь так ограничены, поскольку year передаётся в качестве целочисленного значения, то, например, год 10000 теперь будет соответствовать, поскольку целые числа года не ограничены четырьмя цифрами, так как если бы они находились в регулярном выражении.

Функция django.conf.urls.url() из предыдущих версий теперь доступна как django.urls.re_path() . Старое местоположение остается для обратной совместимости. Старая функция django.conf.urls.include() теперь импортируется из django.urls , поэтому вы можете использовать её как from django.urls import include, path, re_path в ваших URL-адресах.

Mobile-friendly contrib.admin

Теперь панель администрирования поддерживает все основные мобильные устройства. Старые браузеры могут испытывать различные уровни деградации.

Window expressions

Новое выражение Window позволяет добавить OVER к запросам. Вы можете использовать функции окна и агрегатные функции в выражении.

Минорный функционал

django.contrib.admin

  • Новые ModelAdmin.autocomplete_fields аттрибут и метод ModelAdmin.get_autocomplete_fields() позволяют использовать Select2 поисковый виджет для ForeignKey и ManyToManyField .

django.contrib.auth

  • Счетчик итераций по умолчанию для шифровальщика пароля PBKDF2 увеличен с 36 000 до 100 000.

django.contrib.gis

  • Добавлена поддержка MySQL для функции AsGeoJSON , функции GeoHash , функции IsValid , поиска isvalid и поиска расстояний.
  • Добавлены функции Azimuth и LineLocatePoint , поддерживаемые PostGIS и SpatiaLite .
  • Любая GEOSGeometry , импортированная из GeoJSON , теперь имеет свой набор SRID .
  • Добавлен атрибут OSMWidget.default_zoom , чтобы настроить масштаб изображения по умолчанию.
  • Сделаны метаданные, читаемые и редактируемые на растрах через атрибуты метаданных, информации и метаданных.
  • Разрешено передавать параметры создания конкретного драйвера для объектов GDALRaster с помощью papsz_options .
  • Разрешено создавать объекты GDALRaster во внутренней виртуальной файловой системе GDAL . Теперь Rasters можно создавать и преобразовывать в двоичные данные в памяти.
  • Новый метод GDALBand.color_interp() возвращает интерпретацию цвета для полосы.

django.contrib.postgres

  • Новый distinct аргумент для ArrayAgg определяет, будут ли объединенные значения различными.
  • Новая функция базы данных RandomUUID возвращает UUID версии 4. Для этого требуется использование расширения pgcrypto PostgreSQL , которое можно активировать с помощью новой операции миграции CryptoExtension .
  • django.contrib.postgres.indexes.GinIndex теперь поддерживает параметры fastupdate и gin_pending_list_limit .
  • Новый класс GistIndex позволяет создавать индексы GiST в базе данных. В новой операции миграции BtreeGistExtension устанавливается расширение btree_gist , чтобы добавить поддержку классов операторов, которые не встроены.
  • inspectdb теперь может использовать JSONField и различные RangeFields ( django.contrib.postgres должен быть в INSTALLED_APPS ).

django.contrib.sitemaps

  • Добавлен аргумент ключевого слова protocol в конструктор GenericSitemap .

Cache

  • cache.set_many() теперь возвращает список ключей, которые не были вставлены. Для встроенных бэкендов неудачные вставки могут произойти только на memcached .

File Storage

  • File.open() может использоваться как менеджер контекста, например. с file.open() как f: .

Forms

  • Новые аргументы date_attrs и time_attrs для SplitDateTimeWidget и SplitHiddenDateTimeWidget позволяют указывать различные атрибуты HTML для подвиджетов DateInput и TimeInput (или скрытых).
  • Новый метод Form.errors.get_json_data() возвращает ошибки формы в качестве словаря, подходящего для включения в ответ JSON.

Generic Views

  • Новый атрибут ContextMixin.extra_context позволяет добавить контекст в View.as_view() .

Management Commands

  • inspectdb теперь переводит беззнаковые целые столбцы MySQL в PositiveIntegerField или PositiveSmallIntegerField .
  • Новая опция makemessages —add-location определяет формат комментария в файлах PO.
  • loaddata теперь может читать из stdin .
  • Новая опция diffsettings — output позволяет форматировать вывод в унифицированном формате diff .
  • В Oracle инспекция теперь может рассматривать AutoField , если столбец создан как столбец идентификатора.
  • В MySQL dbshell теперь поддерживает клиентские TLS-сертификаты.

Migrations

  • Новая опция squashmigrations —squashed-name позволяет именовать сжатую миграцию.

Models

  • Новая функция базы данных StrIndex находит начальный индекс строки внутри другой строки.
  • В Oracle, AutoField и BigAutoField теперь создаются как столбцы идентификации.
  • Новый параметр chunk_size QuerySet.iterator() управляет количеством строк, выбранных клиентом базы данных Python при потоковой передаче результатов из базы данных. Для баз данных, которые не поддерживают серверные курсоры, он контролирует количество результатов, полученных Django из адаптера базы данных.
  • QuerySet.earliest() , QuerySet.latest() и Meta.get_latest_by теперь позволяют упорядочивать несколько полей.
  • Добавлена функция ExtractQuarter для извлечения квартала из DateField и DateTimeField .
  • Добавлена функция TruncQuarter для обрезания DateField и DateTimeField в первый день квартала.
  • Добавлен параметр db_tablespace для индексов класса.
  • Если база данных поддерживает собственное поле продолжительности ( Oracle и PostgreSQL ), Extract теперь работает с DurationField .
  • Добавлен аргумент QuerySet.select_for_update(), поддерживаемый PostgreSQL и Oracle , для блокировки только строк из определенных таблиц, а не всех выбранных таблиц. Это может быть полезно, особенно если select_for_update() используется в сочетании с select_related() .
  • Новый параметр field_name QuerySet.in_bulk() позволяет получать результаты на основе любого уникального поля модели.
  • CursorWrapper.callproc() теперь использует необязательный словарь параметров ключевого слова, если бэкэнд поддерживает эту функцию. Встроенные серверы Django поддерживают только Oracle.
  • Новый метод connection.execute_wrapper() позволяет устанавливать обёртки вокруг выполнения запросов к базе данных.
  • Новый аргумент фильтра для встроенных агрегатов позволяет добавлять различные условные обозначения в несколько агрегатов по тем же полям или отношениям.
  • Добавлена поддержка выражений в Meta.ordering .
  • Новый именованный параметр QuerySet.values_list() позволяет получать результаты как именованные кортежи.
  • Новый класс FilteredRelation позволяет добавить ON к запросам.

Pagination

  • Добавлен Paginator.get_page() , чтобы обеспечить документированный шаблон обработки недопустимых номеров страниц.

Запросы и ответы

  • Метод runserver для Веб-серверa поддерживает HTTP 1.1.

Templates

  • Чтобы повысить полезность Engine.get_default() в сторонних приложениях, теперь он возвращает первый движок, если несколько механизмов DjangoTemplates сконфигурированы в TEMPLATES вместо того, чтобы выбрасывать NotperlyConfigured .
  • Пользовательские теги шаблонов теперь могут принимать аргументы только для ключевого слова.

Tests

  • Добавлена поддержка потоковой передачи LiveServerTestCase .
  • Добавлены настройки, которые позволяют настраивать параметры тестового табличного пространства для Oracle: DATAFILE_SIZE , DATAFILE_TMP_SIZE , DATAFILE_EXTSIZE и DATAFILE_TMP_EXTSIZE .

Validators

  • Новый ProhibitNullCharactersValidator запрещает нулевой символ во вводе поля формы CharField и его подклассов. Нулевой ввод символов наблюдался из инструментов сканирования уязвимостей. Большинство баз данных молча отбрасывают нулевые символы, но psycopg2 2.7+ создает исключение при попытке сохранить нулевой символ в поле char / text с PostgreSQL .

Изменения без обратной совместимости в 2.0

В некоторых местах удалена поддержка bytestrings

Чтобы поддерживать собственные строки Python 2, более старые версии Django должны были принимать как байты, так и строки unicode. Теперь, когда поддержка Python 2 отбрасывается, байты должны встречаться только вокруг границ ввода / вывода (например, обработка двоичных полей или потоков HTTP). Возможно, вам придется обновить свой код, чтобы ограничить использование байтов до минимума, поскольку Django больше не принимает байты в определенных кодах.

Например, reverse() теперь использует str() вместо force_text() для принуждения аргументов и kwargs , которые он получает, до их размещения в URL-адресе. Для байтов, это создает строку с нежелательным префиксом b, а также дополнительные кавычки (str (b’foo ‘) — «b’foo») . Чтобы адаптироваться, вызовите decode() в байтовой последовательности, прежде чем передавать его в reverse() .

Database backend API

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

  • Методы DatabaseOperations.datetime_cast_date_sql() , datetime_cast_time_sql() , datetime_trunc_sql() , datetime_extract_sql() и date_interval_sql() теперь возвращают только SQL для выполнения операции вместо SQL и список параметров.
  • Сторонние базы данных базы данных должны добавить атрибут DatabaseWrapper.display_name с именем базы данных, с которой работает ваш бэкэнд. Django может использовать его в различных сообщениях, например, в системных проверках.
  • Первый аргумент SchemaEditor._alter_column_type_sql() теперь является моделью, а не таблицей.
  • Первый аргумент SchemaEditor._create_index_name() теперь является table_name , а не моделью.
  • Чтобы включить FOR UPDATE поддержку, установите DatabaseFeatures.has_select_for_update_of = True . Если база данных требует, чтобы аргументы OF были столбцами, а не таблицами, установите DatabaseFeatures.select_for_update_of_column = True .
  • Чтобы включить поддержку выражений Window , установите для параметра DatabaseFeatures.supports_over_clause значение True . Возможно, вам придется настроить методы DatabaseOperations.window_start_rows_start_end() и / или window_start_range_start_end() .
  • Сторонние базы данных базы данных должны добавить атрибут DatabaseOperations.cast_char_field_without_max_length с типом данных базы данных, который будет использоваться в функции Cast для CharField , если аргумент max_length не указан.
  • Первый аргумент DatabaseCreation._clone_test_db() и get_test_db_clone_settings() теперь является суффиксом, а не числом (в случае, если вы хотите переименовать подписи в своем сервере для согласованности). Теперь django.test передает эти значения как строки, а не как целые числа.
  • Сторонние базы данных базы данных должны добавить метод DatabaseIntrospection.get_sequences() на основе заглушки в BaseDatabaseIntrospection .

Отброшена поддержка Oracle 11.2

Окончание поддержки по восходящей линии для Oracle 11.2 — декабрь 2020 года. Django 1.11 будет поддерживаться до апреля 2020 года, который почти достигнет этой даты. Django 2.0 официально поддерживает Oracle 12.1+.

Уровень изоляции MySQL по умолчанию read committed

Уровень изоляции MySQL по умолчанию, повторяемое чтение, может привести к потере данных при типичном использовании Django. Чтобы предотвратить это и для согласованности с другими базами данных, уровень изоляции по умолчанию теперь read committed. Вы можете использовать параметр DATABASES для использования другого уровня изоляции, если это необходимо.

AbstractUser.last_name max_length увеличен до 150

Включена миграция для django.contrib.auth.models.User.last_name. Если у вас есть пользовательская модель, наследующая от AbstractUser, вам необходимо создать и применить миграцию базы данных для вашей модели пользователя.

Если вы хотите сохранить ограничение на 30 символов для фамилий, используйте пользовательскую форму:

Если вы хотите сохранить это ограничение в админе при редактировании пользователей, установите UserAdmin.form для использования этой формы:

QuerySet.reverse() и last() запрещены после slicing

Вызов QuerySet.reverse() или last() на фрагментированном наборе запросов приводит к неожиданным результатам из-за того, что срез применяется после переупорядочения. Это запрещено, например:

Поля формы больше не принимают необязательные аргументы в качестве позиционных аргументов

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

вызывает исключение и заменяется на:

call_command() проверяет параметры, которые она получает

Теперь call_command() проверяет, что парсер аргументов вызываемой команды определяет все параметры, переданные в call_command().

Для пользовательских команд управления, которые используют параметры, не созданные с помощью parser.add_argument() , добавьте в команду атрибут stealth_options :

Индексы больше не принимают позиционные аргументы

вызывает исключение и заменяется на:

Ограничения внешнего ключа теперь включены в SQLite

Это будет отображаться как обратное-несовместимое изменение (ограничение целостности IntegrityError: FOREIGN KEY) при попытке сохранить существующий экземпляр модели, нарушающий ограничение внешнего ключа.

Внешние ключи теперь создаются с DEFERRABLE INITIALLY DEFERRED вместо DEFERRABLE IMMEDIATE. Таким образом, таблицы, возможно, потребуется перестроить для воссоздания внешних ключей с новым определением, особенно если вы используете такой шаблон:

Если вы не воссоздаете внешний ключ как DEFERRED, первый create() завершится ошибкой, если будут применены ограничения внешнего ключа.

Сначала создайте резервную копию базы данных! После обновления до Django 2.0 вы можете перестроить таблицы, используя скрипт, подобный этому:

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

Кроме того, из-за ограничения на изменение таблицы SQLite запрещается выполнять операции RenameModel и RenameField для моделей или полей, на которые ссылаются другие модели в транзакции. Чтобы разрешить миграции, содержащие эти операции, вы должны установить для атрибута Migration.atomic значение False.

Разное

  • Класс SessionAuthenticationMiddleware удален. Он не обеспечивал функциональности, поскольку аутентификация сеанса безоговорочно включена в Django 1.10.
  • Обработчики ошибок HTTP по умолчанию (handler404 и т. Д.) Теперь являются вызывающими, а не пунктирными строками пути Python. Django поддерживает вызываемые ссылки, поскольку они обеспечивают лучшую производительность и возможность отладки.
  • RedirectView больше не отключает NoReverseMatch , если pattern_name не существует.
  • Когда USE_L10N выключен, FloatField и DecimalField теперь соблюдают DECIMAL_SEPARATOR и THOUSAND_SEPARATOR во время проверки. Например, с настройками, ввод «1.345» теперь преобразован в 1345 вместо 1.345.:
  • Подклассы AbstractBaseUser больше не требуются для реализации get_short_name() и get_full_name() . (Базовые реализации, которые поднимают NotImplementedError , удаляются.) Django.contrib.admin использует эти методы, если они реализованы, но не требуют их. Сторонние приложения, использующие эти методы, могут захотеть применить аналогичный подход.
  • Параметры формата FIRST_DAY_OF_WEEK и NUMBER_GROUPING теперь сохраняются как целые числа в выводах JavaScript и JSON i18n.
  • assertNumQueries() теперь игнорирует запросы конфигурации соединения. Раньше, если в тесте было открыто новое соединение с базой данных, эти запросы могли быть включены как часть countNumQueries() .
  • Размер по умолчанию тестового табличного пространства Oracle увеличивается с 20M до 50M, а размер автоэкстенда по умолчанию увеличивается с 10M до 25M.
  • Чтобы повысить производительность при потоковой передаче больших наборов результатов из базы данных, QuerySet.iterator() теперь извлекает 2000 строк за раз, а не 100. Старое поведение можно восстановить с помощью параметра chunk_size . Например:
  • Предоставление неизвестных имен пакетов в аргументе пакетов в представлении JavaScriptCatalog теперь вызывает ValueError вместо молчания.
  • Первичный ключ экземпляра модели теперь появляется в методе модели .__ str __ () по умолчанию, например. Объект вопроса (1).
  • makemigrations теперь обнаруживает изменения в поле limit_choices_to параметра модели. Добавьте это в свои существующие миграции или примите автоматически сгенерированную миграцию для полей, которые ее используют.
  • Выполнение запросов, требующих автоматических пространственных преобразований, теперь вызывает NotImplementedError для MySQL вместо молчания с использованием не трансформированных геометрий.
  • django.core.exceptions.DjangoRuntimeWarning удаляется. Он использовался только в кеш-памяти в качестве промежуточного класса в наследовании CacheKeyWarning для RuntimeWarning .
  • Переименовано BaseExpression._output_field в поле output_field . Возможно, вам придется обновить пользовательские выражения.
  • В более старых версиях формы и формы объединяют свои медиа с виджетами Media, объединяя их. Объединение теперь пытается сохранить относительный порядок элементов в каждом списке. MediaOrderConflictWarning выдается, если заказ не может быть сохранен.
  • django.contrib.gis.gdal.OGRException удаляется. Это был псевдоним для GDALException с Django 1.8.
  • Поддержка GEOS 3.3.x отключена.
  • Способ выбора данных для GeometryField изменен для повышения производительности, а в необработанных SQL-запросах эти поля теперь должны быть завернуты в connection.ops.select .

Функционал, устаревший в версии 2.0

Контекстный аргумент Field.from_db_value() и Expression.convert_value()

Аргумент контекста Field.from_db_value() и Expression.convert_value() не используется, поскольку он всегда является пустым словарем. Сигнатура обоих методов теперь:

Поддержка старой сигнатуры в пользовательских полях и выражениях сохраняется до Django 3.0.

Разное

  • Модуль django.db.backends.postgresql_psycopg2 устарел в пользу django.db.backends.postgresql . Это был псевдоним в Django 1.9. Это влияет только на код, который напрямую импортируется из модуля. Параметр DATABASES по-прежнему может использовать ‘django.db.backends.postgresql_psycopg2’ , хотя вы можете упростить это, используя имя ‘django.db.backends.postgresql’ , добавленное в Django 1.9.
  • django.shortcuts.render_to_response() устарел в пользу django.shortcuts.render() . render() принимает те же аргументы, за исключением того, что он также требует запроса.
  • Значение DEFAULT_CONTENT_TYPE устарело. Он не очень хорошо взаимодействует со сторонними приложениями и устарел, поскольку HTML5 в основном заменил XHTML .
  • HttpRequest.xreadlines() устарел в пользу итерации по запросу.
  • Аргумент ключевого слова field_name для QuerySet.earliest() и QuerySet.latest() устарел в пользу передачи имен полей в качестве аргументов. Напишите .earliest(‘pub_date’) вместо .earliest(field_name = ‘pub_date’) .

Функционал, удаленный в версии 2.0

Также в Django 2.0 были удалены все функции, которые были помечены как устаревшие в версиях 1.9 и 1.10.

Для Django рекомендую VDS-сервера хостера Timeweb .

Как я изучал(изучаю фреймворк Django). Личный опыт.

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

Что нужно знать (необходимый МИНИМУМ) относительно Python:

-Ввод и вывод данных

-Функции и рекурсия

-Работа с модулями и функциями (создание, импортирование, вызов. )

-Основы регулярных выражений

В настоящее время, актуальной версией является Django 2.0. Но я советую начать изучение с версии 1.11. Почему именно так:

1. По Django 2.0 мало различных материалов на русском языке. Для 1.11 материалов достаточно.

2. Django 2.0 и 1.11 очень похожи, но в 2.0 сделали упрощённый синтаксис маршрутизации URL. Из-за этого могут возникнуть сложности на начальном этапе, если пытаться обучаться по материалам основанным на 1.11 версии.

3. Большинство готовых приложений и расширений до сих пор поддерживают только 1.11 версию и не поддерживают 2.

4. Расширенная поддержка версии 1.11LTS заканчивается в 2020 году, а 2.2LTS пока не видно.

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

I. -НАЧАЛО («копипастим» свой первый проект):

-понять как работает фреймворк(установка, как создается проект, архитектура, как взаимодействуют его основные компоненты — urls, модели, шаблоны, views)

1. Проходим туториал на Django-girls.

Шаг за шагом копипастим и пытаемся понять что вообще происходит.

-Основы работы в консоли Linux

-Создание и работа в виртуальном окружении Python.

-Основы основ Django (urls, модели, шаблоны, views)

Альтернативный вариант (более короткий):

Учебник официальная документация (docs.djangoproject.com/en/1.11 — раздел FirstSteps). Или перевод документации с портала djbook.ru

Версия 1.9 а не 1.11, но в этом нет ничего страшного.

2. Цикл лекций «Web-технологии. Разработка на DJANGO» от Mail.ru

Если не интересны основы-основ про web-разработку (уже знаете или задача быстро освоить Django), тогда начинаем смотреть с «9. Web-технологии. MVC фреймворки | Технострим» и дальше.

-Архитектуре и принципам взаимодействия компонентов, основам Django

3. Книга «Django: практика создания Web-сайтов на Python» Владимир Александрович Дронов:

ссылка: сами кУпите или найдёте.

Читаем главы с 1 по 7. Главу 2 опционально можете пропустить, если знакомы с основами Python.

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

-Пониманию основ MVC

-Через примеры кода начнет приходить понимание, как все работает.

-Через копипасту проекта в общем виде начали понимать как все устроено и работает

-Через лекции MAIL.ru узнали как работают web-приложения, как выглядит архитектура типичного web-приложения(взаимодействие бекенда-фронтэнда, работа протоколов, общая архитектура), узнали место Django в этой архитектуре

-Через книгу более детально познакомились с паттерном проектирования MVC (что такое модель, контроллер, представление), через примеры кода начали понимать как это может работать.

II. ПРОДОЛЖЕНИЕ НАЧАЛА(продолжаем «копипастить»):

1. Ищем курс «iTBursa Python&Django». Продажу курса уже закрыли (скорее всего видимо потому, что курс попал в открытый доступ). В курсе есть основы Python и Django. Плюсом идут основы: html/css, bootstrap web, http, databases, linux, shell, git/github, nginx, deployment.

Продолжаем копипастить уже по этому курсу, но теперь самостоятельно выполняем «Контрольные задания»(или не выполняем). В принципе этот курс мог бы заменить все вышеперечисленное. Но так как каждый человек воспринимает информацию по разному, ИМХО лучше усвоится информация, полученная из разных (по типу и виду подачи информации) источников.

Дополнительно: курс itvdn-Django от Антона Мазуна

2. Продолжаем читать и перечитывать Дронова

3. Изучаем официальную документацию или перевод документации 1.9(djbook.ru)

-На этом этапе уже должно быть освоено достаточное количество материалов для написания своего собственного приложения.

II. КОНЦА НЕ ВИДНО(создаём свой собственный проект):

Собственно если все делали правильно, на этом этапе должны быть все необходимые знания для реализации собственного проекта. По сути, можно сосредоточиться только на Джанго, а фронтэнд слепить из кусков Bootstrap.

Теперь отправляемся в свободное плавание на просторы интернета. Теперь уже сами ищем статьи, видео, гайды, бестпрактис. Продолжаем читать Дронова и переходим на актуальную версию Django 2.x

Дополнительно можно начать читать:

-Django подробное руководство. Адриан Головатый. Джейкоб Каплан-Мосс. Книга очень старая (2010), многое изменилось, но общие принципы остались те же.

-Tango with Django. Многие советуют эту книгу.

Вот ещё парочка:

-Web Development with Django cookbook

Извиняюсь за возможные орфографические, и в особенности, за пунктуационные ошибки.

ЗЫ. Кстати, в комментах к моему предыдущему посту (Моя история: опыт изучения программирования) и по почте многие высказывали мысль о создании канала в Телеграмм по данной тематике. Такой канал я создал. Не знаю можно ли ссылку(или нет). Называется python_noobs(PythonNoobs). Сейчас там 12 человек(в основном пикабушники с предыдущего поста — всем кому рассылал свою подборку материалов). Создан чисто для новичков. На канале обмениваемся опытом изучение Python и смежных технологий, делимся ссылками на полезные материалы(статьи, видео, гайды, курсы. ), собираем команду для совместных проектов и просто общаемся, чтобы не прокрастинировать :)

Администрирование Django

Чтобы добавлять, редактировать и удалять записи, для которых мы только что создали модель, мы используем панель управления администратора Django.

Давай откроем файл blog/admin.py и заменим его содержимое на:

Как ты можешь заметить, мы импортировали (включили) модель Post, которую определили в предыдущей главе. Чтобы наша модель стала доступна на странице администрирования, нам нужно зарегистрировать её при помощи admin.site.register(Post) .

Хорошо, теперь нам нужно взглянуть на модель Post. Не забудь запустить веб-сервер командой python manage.py runserver . Перейди в браузер и набери адрес http://127.0.0.1:8000/admin/. Ты увидишь страницу авторизации:

Чтобы залогиниться, тебе сначала нужно создать суперпользователя (англ. superuser) — пользователя, который имеет полный доступ к управлению сайтом. Вернись к командной строке, набери python manage.py createsuperuser , и нажми Enter.

Не забудь: чтобы выполнять команды во время работы сервера, открой новое окно терминала и активируй в нём виртуальное окружение. Мы описывали ввод новых команд в разделе Запуск веб-сервера главы Твой первый проект на Django!.

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

Вернись в браузер и войди в систему при помощи имени пользователя и пароля, которые ты только что выбрала. Ты должна попасть в панель управления Django.

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

Убедись, что выбрала для двух или трёх записей (но не больше) дату публикации. Это пригодится позднее.

Если ты хочешь узнать больше об администрировании Django, то ознакомься с этим разделом официальной документации: https://docs.djangoproject.com/en/1.11/ref/contrib/admin/.

Сейчас, вероятно, подходящий момент, чтобы порадовать себя кружечкой кофе (или чая), а также съесть чего-нибудь для восполнения энергии. Ты только что создала свою первую модель Django и заслужила перерыв!

Создаем свое первое веб-приложение при помощи Django

Django — это Open Source фреймворк для создания веб-приложений различной сложности. Одним из основных преимуществ Django является то, что вам нужно позаботиться только о логике вашего будущего приложения, остальное сделает Django.

Мы создадим веб-приложение, у которого будет панель администратора и возможность загружать загадки, а у пользователей, соответственно, возможность отвечать на них. Во время разработки будут использоваться Python 3.4.3 и Django 1.9.1.

Устанавливаем Django

Делается это очень просто, в командной строке нужно написать: pip install Django==1.9.1 .

Создаем проект

Если вы правильно установили Django, то после запуска django-admin —version вы увидите текущую версию фреймворка. Теперь создадим проект. Это можно сделать следующим образом: django-admin startproject django_example .

Как только создание проекта будет завершено, взглянем на директорию нашего проекта:

  • django_example/__init__.py — пустой файл, который говорит Python, что данная директория должна восприниматься в качестве пакета.
  • django_example/settings.py содержит конфигурацию нашего проекта.
  • django_example/urls.py — здесь объявляются URL.
  • django_example/wsgi.py — с помощью него приложение может работать с веб-сервером по протоколу WSGI.
  • manage.py позволяет взаимодействовать с проектом.

Теперь пришло время запустить наше приложение. Для этого в командной строке нужно написать python manage.py runserver . После этого в адресной строке браузера нужно написать: http://127.0.0.1:8000/ . Если вы увидели «You have unapplied migrations; your app may not work properly until they are applied.», то не волнуйтесь, мы вернемся к этому чуть позже.

Создаем приложение

Определим различие между проектом и приложением. Приложение — это программа, которая что-то делает, а проект — это группа приложений.

Итак, приступим к созданию приложения. Это делается следующим образом: python manage.py startapp riddles .
Как только приложение создано, давайте напишем простой вид, по правилам Django все виды должны храниться в файле views.py .

Теперь, чтобы привязать наш вид к URL, создадим файл urls.py .

В urls.py мы должны написать следующее:

Теперь, если мы запустим наше приложение http://127.0.0.1:8000/riddles/ , мы увидим «Hello, World!».

Установка базы данных

По умолчанию в Django используется SQLite, если она вас не устраивает, то вы можете ознакомиться с нашей статьей, в которой мы рассказываем, как безболезненно перейти с SQLite на MySQL.

4 октября 2020 – 1 марта 2020, Москва и онлайн, беcплатно

Теперь откроем django_example/settings.py и взглянем на переменную INSTALLED_APPS , она хранит все приложения, которые активны в текущем проекте. По умолчанию она содержит:

  • django.contrib.admin — админка, скоро мы ей воспользуемся.
  • django.contrib.auth — система аутентификации.
  • django.contrib.contenttypes — фреймворк для content types.
  • django.contrib.sessions — сессионный фреймворк.
  • django.contrib.messages — фреймворк для отправки сообщений.
  • django.contrib.staticfiles — фреймворк для работы со статичными файлами.

Некоторые из этих приложений используют базы данных, но они еще не установлены, поэтому мы и видели «You have unapplied migrations; your app may not work properly until they are applied.». Поправить это можно следующим образом: python manage.py migrate . Вы должны увидеть следующее:

Теперь создадим нашу модель. Для начала создадим Riddle и Option . В Riddle будет содержаться загадка, в Option — один из возможных ответов на нее.

Данная модель обеспечивает Django информацией, необходимой для создания схемы базы данных и database-access API для доступа к объектам. Теперь нам нужно привязать наше приложение к нашему проекту, делается это следующим образом:

После этого нужно сделать миграцию: python manage.py makemigrations riddles . Вы должны увидеть следующее:

Так мы говорим Django, что в моделях были сделаны некоторые изменения, и их нужно сохранить в качестве миграции.

Проверить, что сделает миграция, можно так: python manage.py sqlmigrate riddles 0001 (0001 — версия миграции, которую мы хотим проверить). На выходе мы получим:

Заметьте, что команда sqlmigrate нужна только для проверки, каждый раз ее запускать необязательно.

Теперь мы можем начать пользоваться панелью администратора. Но для этого нам нужен пользователь. Создать его можно следующим образом: python manage.py createsuperuser . После этого запускаем сервер, если он не запущен, и переходим на http://127.0.0.1:8000/admin/ . Вы увидите следующее:

Теперь дадим админу возможность изменять наши модели. Делается это так:

Вот что получится в итоге:

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

Главная страница

Что нам нужно для создания главной страницы?

  • Templates: скелет нашей страницы.
  • Views: функция на Python для отображения контента.

Начнем с шаблонов. Создадим папку templates внутри папки riddle , а в ней создадим index.html .

Теперь создадим макет для ответов:

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

Давайте пройдемся по каждой функции отдельно:

  • index: Index использует функцию render . На вход она получает HttpRequest, местонахождение шаблона и его содержимое, а возвращает HttpResponse с окончательным html.
  • detail: Detail делает практически то же самое, но только функция get_object_or_404 возвращает HttpResponse404, если нужный объект не был найден.
  • answer: Answer ищет предоставленную загадку (и возвращает 404, если она не найдена) и проверяет правильность ответа.

Теперь добавим наши функции в urls.py :

Добавим немного стилей

Для начала создадим директорию static , а в ней создадим файл main.css .

Немного изменим наши шаблоны:

Первая строка загружает статические файлы, потом мы используем <% static '#' %>, где # — путь к вашему файлу. Аналогичная процедура проводится и для JavaScript.

Теперь вы можете создавать свои собственные приложения на Django.

Исходный код нашего приложения можно скачать по этой ссылке.

Начинаем работу с Django — подключение админки

На предыдущем шаге нами заданы структуры данных для хранения списка вопросов и вариантов ответов для них.

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

Включение админки Django

Чтобы начать использовать админку сайта, предоставляемую Django, нужно предварительно выполенить несколько действий.

Во-первых, в файле настроек проекта settings.py нужно раскоментировать строку django.contrib.admin

Теперь нам снова нужно выполнить команду

Django создаст в базе данных таблицы, которые необходимы для работы админской части сайта.

Теперь нужно отредактировать файл mysite/urls.py, чтобы сообщить Dajngo, какой код нужно вызвать, когда мы обратимся через браузер к админке.

Для этого раскоментируем нужные строки. Теперь файл mysite/urls.py должен выглядеть так:

Строки, которые нужно раскоментировать, подсвечены жирным шрифтом.

Для запуска нашего сайта выполним команду

В консоли вы должны увидеть

Это означает, что все в порядке, и мы можем начинать работу с сайтом. Но вместо http://127.0.0.1:8000/ откроем http://127.0.0.1:8000/admin/

Вы должны увидеть приглашение ввести логин и пароль для входа в админку Django

Входим в админку, используя указанные на первом шаге логин и пароль супер-пользователя.

Создание суперпользователя админки Django

Если по какой-то причине вы не создали суперпользователя раньше, то вы можете это сделать, выполнив консоли команду

Зайдя в админку, вы должны увидеть подобную картину:

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

Отображение объектов в админке Django — подключаем наши модели

Чтобы получить доступ к изменению объектов через админ. часть сайта, нужно зарегистрировать их в приложении admin.

Создайте новый файл в каталоге polls с названием admin.py. В файл вставьте следующий текст:

Теперь перезапустите сервер и обновите или зайдите заново в админку.

Порядок! Теперь нам доступно создание и редактирование новых вопросов через пункт Polls.

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

После заполнения всех полей и сохранения объекта, информация о нем сохраняется в базе данных.

Новый объект появился в списке, однако выглядит не очень информативно:

Дело в том, что для вывода информации об объекте Django использует метод __unicode__(). В созданном нами классе Poll нет такого метода. Добавим его.

Добавление названия объектам

Для вывода информативного названия объекта, добавим метод __unicode__() к классам Poll и Choice.

Отредактируем models.py, добавив выделенный жирным текст:

Теперь после обновления списка объектов Poll в админке используется текст, который мы ввели в качестве вопроса:

Добавление связанных объектов

Чтобы можно было добавить новые варианты ответов через админку, достаточно в файле admin.py добавить:

Теперь “Choices” появилась в Django admin. При добавлении нового варианта ответа нужно будет выбрать соответствующий вопрос:

Однако это не очень удобно. В списке выбора вопроса будут все вопросы, которые были сохранены в базе. Кроме того, логично вводить варианты ответов при добавлении вопроса.

Давайте сделаем это.

В файле admin.py уберем register() для класса Choice и отредактируем регистрацию класса Poll. Измените текст на приведенный ниже.

Теперь объекты Choice могут быть добавлены сразу при добавлении вопроса, при этом Django предложит заполнить сразу 3 варианта, а при необходимости добавить новые.

Единственный момент — класс admin.StackedInline выводит все поля друг под другом и этом занимает много места. В Django admin есть более подходящий класс TabularInline для табличного вывода полей.

Дополнительную информацию по изменеию админки Django можно найти в статье http://itman.in/django-admin-changes/

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

Начинаем работу с Django — подключение админки: 9 комментариев

Здравствуйте. После попытки добавить новый «poll» в админке — получаю ошибку:
«»»
no such table: polls_poll

Request Method: POST
Request URL: http://127.0.0.1:8000/admin/polls/poll/add/
Django Version: 1.8.4
Exception Type: OperationalError
Exception Value:
no such table: polls_poll
«»»
К какому из этапов урока мне нужно вернуться?

Виталий, если вы описали модели в models.py, то возможно ві забыли добавить ваше приложение (в случае описанных уроков оно называется polls) в INSTALLED_APPS.

Посмотрите внимательно вывод выполнения команды
python manage.py syncdb
в http://itman.in/django-howto/#_Django-4

Если дело в этом — просто добавьте приложение в список и выполните
python manage.py syncdb повторно.

Чтобы лучше разобраться с работой Django с базами данных и как можно менять таблицы базы после ее создания — рекомендую прочесь http://itman.in/django-db-migration/.

Но это потом, на первом этапе лучше просто удалить базу и создать заново, пока все не будет получаться :)

Была такая же проблема. Оказалось, что начиная с какой-то версии (1.7 или 1.8) команда syncdb удалена, вместо нее необходимо использовать:
python manage.py makemigrations
python manage.py migrate

python manage.py makemigration
python manage.py migrate

Возникла та же проблема, что и у Виталия

OperationalError at /admin/polls/poll/add/
no such table: polls_poll

Не знаю в чём проблема, везде всё прописано и синхронизировано

Попробуй:
python manage.py makemigrations
python manage.py migrate
python manage.py syncdb

Потом restart server

У меня __unicode__ не заработал, пришлось заменить на __str__

Цукерберг рекомендует:  Как программисту вырасти в руководителя проекта
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих