Полное имя которое должно быть у главной страницы сайта с расширением и учетом регистра
Перейти к содержимому

Полное имя которое должно быть у главной страницы сайта с расширением и учетом регистра

  • автор:

Домен

В Unisender есть все для рассылок: можно создавать и отправлять клиентам письма и SMS, настроить чат-бота и делать рассылки в Telegram и даже собрать простой лендинг для пополнения базы контактов.

Домен — это название сайта и одновременно его адрес, место размещения в интернете. Иногда домен называют «доменным именем» или «доменным адресом».

адресная строка

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

Зачем нужны доменные имена

Любой сайт — это набор веб-страниц, которые содержат контент (тексты, изображения, файлы и иные сведения). Страницы вместе со всем содержимым хранятся на веб-сервере — реальном компьютере. Доменное имя — адрес размещения этих страниц. Когда вы вбиваете в поисковую строку домен, браузер понимает, где искать нужный сервер.
Раньше адреса сайтов указывали цифрами. Чтобы найти сайт, пользователь вводил IP-адрес — комбинацию из четырёх чисел, разделённых точками. Но если компьютер может запомнить любое количество числовых комбинаций, то людям сложно удержать в голове несколько сотен IP-адресов. Поэтому цифры заменили на текстовые имена.

Сравните, какой адрес вам будет удобнее запомнить:

195.13.237.73

или

unisender.com

Это два одинаковых адреса. Но один записан как IP-адрес, а другой — как текстовый домен.

Задача доменного имени — упростить запоминание адреса сайта. Именно поэтому в качестве домена предпочтительно выбирать короткое и запоминающееся слово или словосочетание. Если файлы сайта перевозят с одного сервера (хостинга) на другой, у него может поменяться IP-адрес, но сам домен при этом остается неизменным.

Домен также применяют:

  • Для настройки почты. Например, вы приобрели адрес company.com. Если настроить корпоративную почту, пользователи смогут писать вам на email contact@company.com. С этой почты можно отправлять массовые письма через сервис email-рассылок .
  • Для паркинга. К примеру, вы начали разработку сайта, но опасаетесь, что нужный адрес кто-то займёт раньше. Приобретите домен, а затем разместите на нём баннер с уведомлением о скором запуске ресурса.
  • Для переадресации. Она помогает направлять посетителей на другой сайт или страницу. Например, после редизайна домен сайта изменился. Чтобы не терять посетителей, настраивают переадресацию — когда пользователь указывает адрес старого сайта, браузер автоматически открывает новый сайт.

Из чего состоит доменное имя

Домен состоит минимум из двух уровней, или частей, отделённых друг от друга точками. Расположены домены по иерархии справа налево: третьего уровня, второго уровня, первого уровня. Иерархический порядок позволяет браузеру оперативно определить искомый сервер и соответствующий запросу сайт. Благодаря иерархии функционирует DNS (система доменных имён).

уровни домена

Первый уровень

Часть имени, указанная справа от последней точки — домен первого уровня, доменная зона или домен верхнего уровня (TLD).

site. com

При регистрации выбирают доменную зону из доступных вариантов. Подробный перечень доменов первого уровня указан на сайте администрации интернет-адресов (IANA).

Регистрацию доменов первого уровня контролирует международная организация ICANN . Она хранит и распределяет общую базу доменных имён.

Домены первого уровня разделяют на два основных типа:

  1. Географические — национальные домены верхнего уровня (ccTLD). Для них используют лишь две буквы с учётом международного кода страны. Например, .eu — Евросоюз, .ru — Россия. Такие домены чаще всего обозначают гео-принадлежность сайта. Однако не существует запрета на применение несоответствующего расширения. Иногда для экономии выбирают недорогое доменное имя какой-нибудь небольшой страны.
  2. Тематические — общие домены верхнего уровня (gTLD). Теоретически, они обозначают тематику сайта. К примеру, .com — коммерция, .military — военный, .gov — правительственный. Но никто не проверяет, соответствует ли gTLD каким-либо критериям. Хотя существуют и домены ограниченного использования. Так расширение .int применяют исключительно для доменов международных организаций.

Кроме первого, есть домен нулевого уровня — точка после доменной зоны. Но эту точку игнорируют при указании домена в поисковой строке (site.com.).

Второй уровень

Слева от последней точки — домен второго уровня, он же — основной.

site .com

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

Третий уровень

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

blog .site.com

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

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

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

Как выбрать

Для DNS вид домена не играет роли. Что такое домен с позиции информатики? Это любая уникальная комбинация букв и цифр.

Но выбранное наименование имеет значение для аудитории. Например, адрес созвучный с названием компании внушает больше доверия пользователям — они понимают, что попали на официальный ресурс. Посредством доменного имени можно обозначить сферу деятельности — metal-opt.ru, cleaning.ua.

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

Основные признаки хорошего домена:

  1. Краткость . Выбранное имя должно быть коротким. Так его будет проще написать в поисковой строке.
  2. Запоминаемость . Если люди быстро запомнят адрес вашего сайта, они могут ввести его в поиске по памяти. А вот когда пользователь забыл адрес и начинает искать его в браузере, он вполне может уйти к конкурентам.
  3. Ассоциативность . Желательно, чтобы домен отображал тематику сайта или ассоциировался с компанией. Это помогает запомнить адрес.
  4. Лёгкость произношения . Адрес домена должно быть удобно сообщить в устной беседе или произнести по телефону.
  5. Отсутствие «сложных» букв . Некоторым русским буквам при транслитерации соответствует несколько букв латинского алфавита или одну и ту же букву можно транслитерировать по-разному. Например — русская «ф» может выглядеть как «f» или ««ph», а русскую «и» можно написать как «i» или «y». Постарайтесь избегать таких символов.

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

  • общая длина варьируется от 2 до 63 символов;
  • в качестве промежуточных символов можно использовать латиницу, цифры, дефис;
  • название не начинается с дефиса;
  • прописные и строчные буквы равнозначны;
  • при регистрации в зоне .рф или .рус применяют кириллицу.

При этом применяется так называемый Punycode. Это способ перевода кириллицы в латинницу, т.к. адрес домена формально может содержать ТОЛЬКО латинские буквы. Поэтому у любого кириллического домена есть «страшное» название латинницей (например сайт «юнисендер.рф» будет иметь вид «xn--d1abbjycxd8i.xn--p1ai»).

Технический директор Mailfit

Что проверить перед регистрацией

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

Можно бесплатно использовать Whois-сервис для поиска свободных доменов. Например, проверим у регистратора REG.RU адрес vk.com.

Проверка через whois-сервис

Укажем в поисковой строке адрес и кликнем «Проверить». Спустя несколько секунд увидим ответ системы — «Домен занят».

Проверка адреса vk.com

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

Информация о домене

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

Также Whois-сервисы позволяют проверять историю выбранного домена: кто был прежним регистратором, когда началась и закончилась предыдущая регистрация. Проверка истории домена — платная услуга.

Проверка истории домена

При проверке истории через Whois доступны разные типы запросов

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

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

Вы также можете проверить содержание старого сайта, поискав его в веб-архивах (к примеру в Web-archive ). На сохранённых копиях веб-страниц посмотрите контент, дизайн, тематику. Если доменное имя использовалось для сайта сомнительного содержания или компании с плохой репутацией, лучше его не приобретать.

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

KnowEm

Сервис проверки доступности доменов KnowEm

Что нужно знать о покупке домена

Не покупка, а аренда

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

Минимальный срок аренды доменного имени равен одному году. К примеру, домены с расширением .ru, .рф, .su приобретают на год и ежегодно продлевают аренду.

Максимальный период аренды обусловлен правилами выбранной зоны. Например, на период до десяти лет можно регистрировать домены в зонах .com, .info, .онлайн, .blog.

Длительность аренды и порядок продления вы узнаете при регистрации. Также эту информацию можно посмотреть в базе знаний регистратора.

Продление аренды

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

Если аренда домена закончилась, и владелец не успел её продлить, то у него есть 30 дней на продление. Этот срок может варьироваться в зависимости от регистратора. В это время сайт и почта на домене перестают работать. Доменное имя попадает в перечень освобождающихся адресов, и другие пользователи могут делать на него ставки на аукционе доменов. По окончанию этих 30 дней любой пользователь может приобрести домен.

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

Удаление домена

Домены в зонах .рф, .ru, .su удаляют на следующий день после окончания периода преимущественного продления. Международные домены удаляют спустя 1-5 дней. С этого момента домен становится доступен всем желающим. Бывший владелец может попытаться зарегистрировать его вновь. Однако никаких преимуществ перед остальными претендентами он уже не имеет. Кто оформит домен первым, тот и будет новым владельцем.

Как зарегистрировать

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

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

Проверка домена

Результаты проверки доступности домена

2. Регистрация выбранного варианта. Будущий администратор указывает контактные данные и оплачивает счёт. Часто регистраторы предлагают дополнительные услуги — сокрытие персональных данных, автопродление, SSL-сертификат и прочее.

Оформление аренды домена

Оформление аренды домена

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

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

Сразу после приобретения доменного имени вы можете привязать его к своему сайту, создать почтовый ящик и отправлять обычные или таргетированные рассылки своим клиентам. Вместе с тем вы не обязаны использовать приобретённый домен сразу же. Его можно сохранить «про запас». По этому принципу некоторые компании скупают одинаковые адреса в разных доменных зонах, чтобы ими не воспользовались конкуренты.

Настройка главной страницы, чтобы оформление веб-сайта

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

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

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

Дополнительные сведения о главных страницах см. в статье Введение в главные страницы SharePoint.

Примечание: Следуйте инструкциям в этом разделе, требуются соответствующие разрешения. По умолчанию должен быть является членом группы владельцев сайта, группа «Конструктор» или администратора семейства веб-сайтов откройте сайт SharePoint с помощью SharePoint Designer 2010 и настройку главных страниц. Если вы входите в одной из этих групп, но не удается просмотреть параметры, упоминаемые в этом разделе, реализация SharePoint могут настроить так, чтобы ограничить кто может использовать SharePoint Designer. Обратитесь к администратору сайта, чтобы узнать.

В этой статье

  • Обзор: главные страницы как определение разметки страницы
    • Просмотр основной главной страницы
    • Настройка или начало с нуля?
    • Главные страницы по умолчанию в SharePoint 2010
    • Настройка основной главной страницы
    • Создание копии основной главной страницей
      • Работа с элементами управления заполнителями контента
        • Обнаружение и изменение элемента управления заполнителем контента
        • Оптимизация работы с каскадными таблицами стилей с помощью тегов DIV
        • Изменение стилей на главной странице и создание настраиваемой каскадной таблицы стилей

        Обзор: главные страницы как определение разметки страницы

        Главные страницы определяют общую разметку и интерфейс страниц SharePoint.

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

        Другие типичные постоянные элементы включают ссылку входа, в меню Действия сайта и командами ленты в том же месте на каждом дочерний сайт.

        Эти элементы хранятся в основной главной страницей.

        Отдельные страницы на сайте SharePoint — на домашнюю страницу, вики-страницы, представления списка — обрабатываются как страниц контента сайта. При просмотре этих страниц в браузере, они объединяются с главной страницей для получения одного непрерывного веб-страницы.

        Главная страница отображает постоянные элементы и макет, а страницы контента — уникальный контент.

        Просмотр основной главной страницы

        1. Откройте сайт в SharePoint Designer и выберите в области навигации пункт Главные страницы.
        2. Нажмите кнопку v4.master, чтобы просмотреть сводные сведения в коллекции главных страниц.
        3. Выберите на ленте команду Изменить файл, чтобы открыть главную страницу.

        Главная страница откроется в полноэкранном редакторе страниц SharePoint Designer 2010.

        В нем можно изменить страницу в представлении «Конструктор», комбинированном режиме или представлении кода. Благодаря поддержке отображения во время разработки можно просмотреть, как будет выглядеть главная страница, по мере ее настройки. Кроме того, доступны средства настройки тегов, стилей, сценариев и областей контента, как показано ниже.

        Эталонные страницы SharePoint 2010

        A ряд функций упростить создание и настройку главных страниц в SharePoint Designer 2010, чем это было в прошлом:

        • Меню навигации включает категорию Главные страницы, которая предоставляет прямой доступ к коллекции главных страниц.
        • При изменении главных страниц можно использовать средства редактирования для вставки слоев и управления ими, а также настройки положения тегов DIV; слои и другие элементы можно быстро найти с помощью параметра Щелчок булавки, который служит для навигации по перекрывающимся слоям.
        • Создаваемые сайты и страницы веб-частей автоматически связываются с основной главной страницей, благодаря чему не нужно каждый раз сопоставлять их вручную.

        Настройка или начало с нуля?

        Чтобы использовать настраиваемые основной главной страницей в список сайтов SharePoint 2010, вы можете:

        • Настроить копию основной главной страницы по умолчанию (v4.master ) или
        • Создать новую настраиваемую главную страницу с нуля и сделать его основной главной страницей веб-сайтов.

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

        Оба подхода имеют достоинства и недостатки.

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

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

        Главные страницы по умолчанию в SharePoint 2010

        На странице v4.master является основной главной страницы по умолчанию в SharePoint 2010. Он предоставляет внешний вид и функции SharePoint 2010, интерфейса и функций, таких как лента — новый интерфейс с меню, кнопки и команды так же приложения Microsoft Office. Основной главной страницей используется для страниц и страниц приложений в SharePoint 2010.

        Ниже приведены все главные страницы, которые поставляются вместе с SharePoint 2010.

        Имя и имя файла по умолчанию

        Использование на сайте SharePoint

        Основная главная страница

        Применяется для страниц контента и администрирования. Предоставляет интерфейс и макет для SharePoint 2010.

        Домашняя страница сайта группы, страницы списков и библиотек, страница параметров сайта.

        Минимальная главная страница

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

        Домашняя страница и страницы результатов поиска центра поиска, страницы, на которых размещены веб-приложения Word или Excel.

        Главная страница публикации

        Используется для страниц на сайте SharePoint Server с поддержкой публикации.

        Домашняя страница, страница сведений о компании или пресс-релизов на сайте интрасети, экстрасети или доступном из Интернета сайте, поддерживающем публикацию.

        Главная страница по умолчанию 2007

        Используется для поддержки устаревших сайтов SharePoint, для которых не было выполнено визуальное обновление до SharePoint 2010.

        Домашняя страница, страницы сайта и страницы списков сайта SharePoint 2007, для которых не было выполнено визуальное обновление.

        Примечание: Существует еще одна главная страница, simplev4.master, которая используется для экранов SharePoint, например Login.aspx, Error.aspx и Confirmation.aspx. Она находится на сервере, и ее нельзя настроить в SharePoint Designer 2010.

        Совет: В дополнение к этим главным страницам можно загрузить начальную главную страницу с сайта MSDN. Она содержит компоненты, сценарии заполнители, минимально необходимые для отрисовки страницы в SharePoint. Ее можно применять для создания полностью нового оформления с нуля. Ее назначение аналогично функции страницы «minimal.master», которая была доступна в SharePoint 2007.

        Настройка основной главной страницы

        Для настройки главных страниц в приложении SharePoint Designer 2010 нужно сначала открыть его с самого сайта или из меню Пуск. Открыв сайт в SharePoint Designer 2010, выберите в области навигации пункт Главные страницы.

        Для большинства сайтов в коллекции главных страниц выводятся три главные страницы: v4.master, minimal.master и default.master.

        Эталонные страницы SharePoint 2010

        Создание копии основной главной страницей

        1. Откройте сайт в SharePoint Designer и выберите в области навигации пункт Главные страницы.
        2. Щелкните правой кнопкой мыши v4.master и нажмите клавиши Ctrl + P, чтобы вставить ее копию в коллекции главных страниц.
        3. Нажмите кнопку v4_copy (1) .master Чтобы просмотреть сводные сведения в коллекции главных страниц.
        4. Выберите на ленте команду Изменить файл, чтобы отобразить главную страницу.

        Главная страница откроется в полноэкранном редакторе страниц SharePoint Designer 2010, где ее можно изменить в представлении «Конструктор», комбинированном режиме или представлении кода. Благодаря поддержке отображения во время разработки можно просмотреть, как будет выглядеть главная страница, по мере ее настройки. Кроме того, доступны средства навигации и настройки тегов, стилей, сценариев и областей контента, как показано здесь.

        Работа с элементами управления заполнителями контента

        Главные страницы и страницы контента взаимодействуют посредством набора заменяемых областей, или элементов управления заполнителями контента. Каждый заполнитель контента (который указывается в коде страницы как ContentPlaceHolder) представляет контент главной страницы, который можно переопределить. Любая страница сайта может заменить данные заполнителя, предоставив соответствующий элемент управления контентом. Этот элемент управления контентом может быть даже пустым: в этом случае элемент будет полностью удален из преобразованной для просмотра страницы.

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

        Для поиска всех элементов управления заполнителями контента на странице можно использовать функцию Управление областями контента. Элементы управления можно просматривать как в представлении кода, так и в редакторе WYSIWYG.

        Здесь вы видите элемента управления PlaceHolderSiteName, который используется для отображения имени сайта.

        Эталонные страницы SharePoint 2010

        Другим важным заполнителем контента является PlaceHolderMain. Он заменяется страницей контента при ее просмотре в веб-браузере.

        Макет контента на сайте SharePoint можно изменить, переместив элементы управления заполнителями контента.

        Дополнительные сведения о работе с заполнителями контента см. в статье Работа с элементами управления заполнителями контента.

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

        Эталонные страницы SharePoint 2010

        Обнаружение и изменение элемента управления заполнителем контента

        Выполните указанные ниже действия, чтобы найти элемент управления заполнителем контента PlaceHolderSiteName на основной главной страницы SharePoint 2010.

          Откройте сайт в SharePoint Designer 2010 и выберите в области навигации пункт Главные страницы.

        Примечание: Если пункт Главные страницы не отображается в области навигации, возможно, он отключен в SharePoint. Обратитесь за подробностями к администратору сайта. Дополнительные сведения см. в статье Управление SharePoint Designer 2010.

        Эталонные страницы SharePoint 2010

      • В коллекции главных страниц щелкните v4.master.
      • На странице сводки главной страницы выберите команду Изменить файл.
      • Если будет предложено извлечь файл, нажмите кнопку Да.
      • Если страница отображается в режиме конструктора, можно просто щелкнуть область на ней, чтобы увидеть элемент управления заполнителем контента, который предоставляет контент.
      • Кроме того можно просматривать элементы управления доступными заполнитель, перейдя на вкладку стиль и в группе главной страницы нажмите кнопку Управление областями содержимого. Использование этой функции можно легко и быстро найти элементами управления заполнителями контента на главной странице.
      • В списке области содержимого выберите PlaceHolderSiteName и нажмите кнопку Перейти. Нажмите кнопку Закрыть. Элемент управления заполнителем контента выбрано на странице следующим образом.
      • Здесь можно изменить параметры элемента, настроить его положение, применить разные стили и т. д. Завершив настройку, сохраните главную страницу.
      • В ответ на предупреждение, что для страницы будет изменено ее определение сайта, нажмите кнопку Да.
      • Примечание: По умолчанию страницы SharePoint связаны с файлами определения сайта. После настройки главной страницы в SharePoint Designer 2010 она больше не связана с определением сайта. Это может потребовать дополнительных административных усилий после обновлений SharePoint в будущем, поэтому и отображается данное сообщение. При необходимости для главной страницы всегда можно восстановить ее определение сайта.

        Внесенные изменения появятся на всех страницах, связанных с главной страницей, если они не были настроены непосредственным образом.

        Работа со стилями

        Наиболее простой и быстрый способ изменения стилей главной страницы — применить к ней готовую тему. Просмотреть и применить доступные темы можно, щелкнув ссылку Изменить тему сайта в разделе Настройка на вкладке Параметры сайта в SharePoint Designer.

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

        Оптимизация работы с каскадными таблицами стилей с помощью тегов DIV

        Основной главной страницы по умолчанию в SharePoint 2010 использует тегов DIV для определения строки блока элементов и разделы на странице. Тегов DIV предоставляют ряд преимуществ по сравнению с тегов таблицы, которые использовались в более ранних версиях. С помощью тегов DIV есть:

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

        HTML-таблицы все еще используются, например при вставке веб-частей и другого контента SharePoint на страницу. Однако при настройке главных страниц для структурирования контента можно использовать преимущественно теги DIV.

        Изменение стилей на главной странице и создание настраиваемой каскадной таблицы стилей

        Для изменения стилей щелкните меню Стиль, а затем выберите нужный параметр работы с каскадной таблицей стилей.

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

        Настройка новой главной страницы в качестве основной главной страницей

        Создав новую главную страницу в SharePoint Designer 2010, вы можете быстро сделать новую главную страницу основной главной страницы для всего сайта.

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

        1. Откройте SharePoint Designer 2010 и сайт SharePoint.
        2. В разделе Объекты сайта в области навигации пункт Главные страницы.
        3. В списке Главных страниц в области навигации щелкните правой кнопкой мыши главную страницу, вы хотите использовать по умолчанию главного основного и выберите команду Задать по умолчанию главные страницы.
        4. Вернуться на сайт SharePoint и обратите внимание, что изменилось главной страницы по умолчанию основной.

        Как сделать правильный title для сайта

        как написать идеальный title

        Правильный заголовок (Title) по-прежнему входит в ТОП 5 факторов, влияющих на ранжирование в Google. Хороший title не только повышает позиции страницы в выдаче, но и привлекает больше внимание пользователей.

        Работа над title — это работа по увеличению трафика. Вы же этого хотите, не так ли?

        Содержание:

        Подробная инструкция как грамотно составить и сделать Title привлекательным не только для поисковиков, но и для людей. В это статье я собрала, пожалуй, всю информацию, включая некоторые свежие лайфхаки 2019 года из доклада Semrush и Moz.

        Что такое мета тег Title и чем он отличается от H1
        Какой длины должны быть Title и H1?
        Правила написания тега title – инструкция с примерами
        Как правильно использовать символы и знаки в Title
        Как не нужно писать title
        Лайфхаки и идеи 2019 года для крутого Title и Snippets
        Почему заголовок моей страницы в выдаче отличается о того, что я указал?

        Что такое Title и H1 и для чего они нужны?

        Title – это заголовок страницы, не текста, а именно всей страницы со всеми элементами, включая футер и сайдбар.

        Тег H1 в отличии от тайтл является заголовком только текстового блока статьи. Если представить страницу, как фирму, то «title» – ее директор, а «h1» – начальник отдела. Если на странице нет Title, то Google берет значение от заголовка H1. Еще одно важное различие: H1 вы видите на странице, т.е. он для людей, а Title виден прежде всего поисковым системам, на самой странице он не показывается. Его можно увидеть только в двух местах: на странице выдаче и на вкладке в браузере.

        На картинке вы можете видеть выдачу по запросу kje oprati perilo (кстати, приятно видеть, что наш клиент pranje.si находится в топе), на скрине указаны сниппет и тайтл.

        snippet and title

        Как вы видите, title не показывается весь, а только 66 знаков, остальное обрезается. Так что располагайте самое главное в начале. Сниппет в некоторых случаях образует из description, а в некоторых его формирует сам Google. Почему это происходит я расскажу позже.

        Какой длины должен быть Title?

        Максимально допустимая длина title – до 200 символов с пробелами или около 20 слов. Причем Яндекс и Гугл будут учитывать каждое слово. Но в поисковой выдаче заголовок страницы, как вы уже заметили, обрезается.

        Google показывает примерно 55-76 символов или 5-8 слов, иногда до 12. Почему такая неопределенность? на это есть три причины:

        1- потому что, строго говоря, поисковики делают выдачу 600 pxl, а разные буквы в пикселях занимают разное количество пикселей.

        2-зависит от того какие слова и какой язык (в английском фразы короче, в немецком и русском — длиннее).

        3- зависит от того мобильная эта выдача или десктопная. Вы удивитесь, что в мобильной версии Google показывает иногда более длинные тайтлы.

        Хотите быть точно уверены, что весь заголовок будет виден? ставьте 55 знаков (к слову, у Яндекса видимая часть составляет 56 символов, с учетом пробелов и 3-х точек.)

        Но это скорее рекомендация, чем правило. В 2019 году Google уделяет все внимание «пользовательскому опыту» и «удовлетворенности посетителей», так что если вы составите тайтл из 12 слов и более, он также будет работать, но исследования удобства использования показали, что длина хорошего заголовка страницы составляет около семи или восьми слов и менее 64 символов. Так что оптимальная же длина Title в 2019 году по-прежнему составляет 60-70 символов, это примерно 12 слов.

        Но не зацикливайтесь на количестве слов, ориентируйтесь на смысл и не забывайте, что первые 3-4 слова САМЫЕ важные.

        Update от 26.02.2021!

        В феврале 2021 Google неожиданно сообщил, что title может быть длиннее 55-60 символов. Вопрос к Google звучал так: «Есть ли польза от тегов title, которые длиннее текста, отображаемого в поисковых сниппетах?». Сотрудник Google Гэри Илш ответил: «Да». Уточнять он не стал.

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

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

        Мораль — не ограничивайте себя, главное title должен быть релевантен и самое главное должно находится в первых 3-4 словах.

        Хотите увидеть сниппет вашей страницы в Google ?

        воспользуйтесь генератором для SERP Google

        Как правильно использовать символы и знаки при написании Title

        Часто при составления Title употребляют в нем помимо знаков препинаний также самые различные знаки и спецсимволы вроде: |, /, ().@,$,%, ★ ☎ ☢ ☑ ☒ ☯ ♠ ♥ ❤ ♦ ♨ ♬ и.т.д. И вставлять такие символы надо правильно (см. таблицу ), чтобы не получить в сниппете значки типа #3456.

        Делают это зачастую для более привлекательного сниппета, а иногда вообще непонятно зачем ***, но как оказалось больше беды делают не такие вот спецсимволы, а самые обычные знаки препинания: точка, запятая, тире, двоеточие, знаки вопроса и восклицательный знак ( . ), ( , ), ( ! ), ( ?), ( : ). Давайте разберем почему.

        1 Двоеточие. Использование двоеточия в title говорит, что текст, следующий за ним, раскрывает суть слова до него и служит ключевой темой статьи. То есть если написать title типа: «Продажа через Инстаграм: 5 простых шагов» — то слова перед двоеточием будут иметь меньший вес, так как двоеточие показывает поисковику, что смысл статьи заключается в тексте после него. Т.е большим весом обладает ключ «5 простых шагов». » Возможно, правильно было бы Настройка продаж в Инстаграме за 5 простых шагов.

        2 Тире и запятая. Использование тире и запятых ( — ) и ( , ) в title показывают, что обе части заголовка равноправны, и тема, раскрываемая на странице, касается их в равнозначной степени. Такой вид разбиение текстов в заголовке наиболее оптимальный. Например, Интернет магазин Гений — развивающие игры для детей и взрослых.

        3 Точка. Точка в Title показывает законченность предложения, поэтому слова до и после нее не будут ранжироваться в одной связке и будут разбиты на самостоятельные ключи, т.н пассажи. Например, Интернет магазин русской кухни. Доставка русских продуктов по Словении

        4 Восклицательный знак и знак вопроса. Использовать ! и ? в tutle стоит, если вам надо разбить ключ на два пассажа и придать выразитительность/призывность тексту. Например, Куда сходить в выходные? В детский развлекательный парк, конечно же!

        5 Вертикальные линии ( / ) или ( | ). Эти знаки идентичны тире и запятой и показывают, что обе части заголовка равноправны: Интернет- магазин детских товаров | Babyboom.com

        *** Из кодовых символов используемых в Title лишь немногие из них заслуживают внимания, по крайней мере от Google — это знак авторского права(©), символ торговой марки (™), и символ зарегистрированного товарного знака (®), но и для них необходимо использовать кодовые значения:

        • “©” илиr “&# 8482″ для ©
        • “& trade” или “&# 8482″ для ™
        • “& reg” для ®

        Все остальные символы, такие как ★ ☎ ☢ и другие учитываются лишь как лишний символ и прямого воздействия на ранжирования не имеют. В теории такие символы могут увеличить кликабельность по вашему сниппету в результатах выдачи, но на практике часто получается обратное. Как вы догадались, все сильно зависит от целевой аудитории. Лично мое мнение — не стоит, или ооочень осторожно и в малых дозах.

        Как не нужно писать title

        Основные ошибки, которые совершают новички из-за лени, незнания или наоборот из-за желания «сделать как лучше» следующие:

        1. Переспам ключевым словами. Не надо впихивать все в один Title, 1-2 ключа и хватит. За переспам поисковики пессимизируют (т.е. понижают в выдаче).
        2. Title идентичен H1. Они должны быть разными, title более разнообразен по смыслу.
        3. Использование большого количества лишних слов. Особенно прилагательных. Типа » самая лучшая в городе парикмахерская». Зачем? В title каждое слово на вес золота, а про то, кто в городе лучший Google и так знает, судя по трафику и оценкам в google map. Использование лишних фраз «разбавляет водой» продвигаемые ключи.
        4. Однотипные title. Например, 2 страницы товара, два флага: Флаг Словении 60×20 см И Флаг Словении 5х10см. Различия мало, не так ли? Есть риск, что одна страница каннибализируют другую. А ведь можно было оптимизировать под запросы Флаг Словении большой для манифестации и Флаг (флажок) Словении маленький настольный. Люди редко ищут флаги по размерам, скорее оперируют прилагательными или интентами («для чего мне эта вещь? что с ней собираюсь делать?»). Но, как указано в предыдущем пункте, использовать прилагательные стоит осторожно и только когда они привносят важный смысл.
        5. Использование верхнего регистра. На пользовательском уровне это воспринимаете как капс, как спам, как крик. Кроме того, как уже упоминалось выше, большие буквы занимают больше места в Title, где каждый пиксель на счету.
        6. Написание title наобум без сбора и анализа семантики. Вы удивитесь, но все люди мыслят по-разному. Не полагайтесь на собственное видение, соберите семантическое ядро, определите самые популярные и релевантные запросы, посмотрите сниппеты конкурентов в выдаче ТОП10 — и вперед!
        7. Автоматический перевод на другой язык. Если у вас многоязычный сайт, то в каждой языковой версии у страниц должны быть свои языковые тайтлы. Вроде логично, но часто видишь, как на других языках остаются все одни и те же тайтлы. Что важно, ни в коем случае нельзя просто автоматически перевести title на другой язык, он должен быть написан так, как ищут, как говорят носители языка и причем наиболее популярный вариант.
        8. Фраза начинается с отрицательной частицы Не . Момент скорее психологический, вносит негатив в восприятие, но в некоторых тематиках может быть полезен.
        9. Проявление нарсицизма. Тоже психологический момент. Какой смысл писать в заголовке «Фирма Бэтмен — лидер в грузоперевозках Словении». Как это заявление решает потребность пользователя? никак. Людям все равно что вы о себе думаете и какую часть рынка занимаете.

        Пример 1 (к п.6).

        Чтобы все эти рекомендации не звучали абстрактно, хочу привести живой пример из нашей жизни. Cайт coffeebulava.com и заголовки главной страницы следующие:

        primer title

        Итак, главная страница сайта занимающегося обжаркой кофе оптимизирован под запрос Bulava kavnj atelje, при этом заголовки ни H1-H6, ни тег Description не указаны. Если мы посмотрим статистику запросов, то увидим, что такого запроса люди не делают, ни полностью, ни с разбивкой на Bulava и на kavni atelje. Рассмотрим некоторые другие запросы относящиеся к обжарке кофе и увидим следующую статистику:

        • mikrošražarna — 0 запросов
        • mikro pražarna — 0 запросов
        • pražarna kave — 70 запросов
        • sveža pražena kava -100 запросов

        2 последних запроса уже радуют! Смотрим, появляется ли рассматриваемая страница в топ 10 в результате этих запросов (как я расскажу ниже, Гугл анализирует также и контент страницы, иногда можно попасть на хорошую позицию в результате мощного и уникального контента). Для чистоты эксперимента пользуемся специальным расширением, которое позволяет увидеть выдачу строго по Словении, а также по Любляне. Видим, что сайта в топе нет, но все конкуренты сайта как раз в топ 10 — Stown, Mala Prаžarna, Coronini cafe, Mariposa и прочие присутствуют. Проанализируем контент страницы с помощью расширения Keyword Everywere на предмет плотности слов и видим, что наибольшую плотность имеют слова не относящиеся к прожарке кофе, а ключ pražarna kave имеет всего 0,69% плотность:

        плотность ключей

        Это классический пример, как неправильная работа с заголовками лишает сайт трафика.

        Пример 2. Рассмотрим интернет-магазин детской одежды (кстати, достаточно конкурентная тема в Словении). Сайт prvipaketek.si, имеющий сл. заголовки:

        Видно, что над сайтом велась какая-то работа по оптимизации, однако, оба ключа prvi paketek, telegram ob rojstvu не являются популярным запросом, частотность ноль. Сделаем шаг в сторону и посмотрим другие ключи ..и да! есть интересные частотные запросы, например, komplet za novorojenčka iz porodnišnice, под который можно было бы оптимизировать сайт и получить бОльший трафик:

        ključne besede

        • Продвигать свой бренд стоит . Но! но не в начале title в начале бизнеса, когда о вас никто не знает и нет трафика по брендовому запросу.
        • Свое мнение хорошо, то объективная статистиков запросов лучше. Инвестиции в сбор и анализ семантики окупаются многократно. Ваш магазин не для вас, а для других людей. Поэтому изучайте их: чего они ищут, какие у них «боли», какие задачи решает покупка вашего товара.

        Хотите улучшить трафик сайта ?

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

        Правила написания мета Title: инструкция с примерами.

        Что нужно учитывать при составлении заголовка страницы
        • Всегда начинайте мета-тег с основного запроса в правильной форме;
        • В первых 60 знаках старайтесь разместить наиболее важные слова, в порядке убывания значимости;
        • Далее употребляете менее важные ключи, слова или название компании;
        • Помните, что каждое слово забирает часть веса и чем дальше оно от начала, тем меньше его значимость;
        • Не используйте знаки препинания, разбивающие пассаж. К ним относится точка, восклицательный и вопросительный знак. Запятые, тире и двоеточия использовать можно, но при необходимости, чем их меньше, тем лучше. (подробнее об этом — см ниже)
        • На сайте не должно быть одинаковых тайтлов. Также желательно, чтобы с остальными веб-ресурсами было меньше пересечений. Поэтому для уникализации добавляете в конец заголовка название вашей фирмы или бренда.

        Стоп-слова и символы

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

        Наиболее популярные стоп-слова:

        В словенском варианте — in, oz., ob, za, do, k и тд.

        В англоязычном интернет союзы и/или принять заменять соответственно на & и |.

        Особенности составления мета-тега title для разных типов страниц

        Универсальный шаблон написания заголовков title подходит не всегда, в зависимости от конкретной ситуации он может меняться. Например, для интернет-магазина и информационного сайта данный мета-тег составляется по-разному. Да и в пределах одного ресурса (главная страница, категории, карточки товаров) шаблон тоже отличается.

        Общие рекомендации

        Title должен состоять из:

        • главного ключа (в начале, в той словоформе по которой вы продвигаетесь);
        • хвоста запросов (меняется в зависимости от тематики вашего сайта);
        • топонима (город, в котором находится компания, или ее наиболее крупный филиал. Например, Москва. Используется только в случае, если запрос геозависимый ); **
        • второстепенного ключа или синонима;
        • бренда или адреса сайта***.

        ** данная рекомендация относится больше к Яндексу, чем к Google. Согласно данным Moz, использование топонима не влияет или даже ухудшает видимость страницы в локальной выдаче. Имейте это в виду. Писать или не писать топоним — зависит под какую поисковую систему вы оптимизируетесь и какой у вас бизнес — локальный (ресторан, театр и тп.) или онлановый (интернет-магазин, сайт по продажам книг онлайн).

        *** Update. В 2020 году Moz опубликовал исследование, в котором утверждалось, что лучше не стоит в конце Title страниц товаров ставить название фирмы. Это никак не продвигает товар, а только занимает полезное место. Так что лучше весь title посвятить названию товара.

        В общем виде шаблон выглядит таким образом:

        Primary Keyword — Secondary Keyword | Brand Name

        Главный ключ + важный запрос из хвоста + топоним + второстепенный ключ из хвоста + другая форма главного ключа (словоформа, синоним, транслитерация) + добавочные слова | Бренд (сайт)

        Вот простой пример:

        title good

        или немного расширенный

        ideal title

        Для главной

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

        • Интернет-магазин необычных подарков — Шкатулка;
        • Юридические услуги в Любляне «Партнеры и Ко.
        Для категорий

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

        Универсального варианта не существует, но в качестве хороших примеров подойдут следующие формулы:

        • [Название категории] – купить в [городе] | интернет-магазин [название магазина];
        • [Название категории] – купить в [городе], цена [альтернативное название категории] в интернет-магазине [название магазина].
        Под альтернативным названием категории подразумевается:
        • транслит бренда (один раз указываете на английском, второй – на русском);
        • синоним (например, ноутбук – лэптоп);
        • название в другом числе, с измененным предлогом или в другой форме.

        Столы для кухни — купить в Мариборе с доставкой | «УютМебель».

        Примечание: слова «купить, с доставкой, заказать» столь популярные для транзакционных запросов в России и Украине (т.е. для самых горячих конверсионных запросов) в Словении не используются, а используются другие аналоги — cene, cenik, koliko stane. А иногда могут вообще ничего не писать, просто название товара. Особенности менталитета, просто примите к сведению.

        Для карточек товара

        Title для карточек товара тоже автоматически генерируется по шаблону:

        [Название товара] — купить + регион + (интент или свойства)

        По интентом подразумевается цель, назначение, словом для чего и как. Например, купить

        • оптом
        • недорого
        • в кредит
        • лучший
        • словенский
        • в наличии и тд.
        • Стол раскладной Artef зеленый — купить в Мариборе недорого
        • Обжаренный кофе из Южной Америки купить в Любляне оптом
        Для информационной статьи

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

        • Синдром Кавасаки: симптомы, диагностика, лечение;
        • 5 простых шагов, чтобы продавать товары в Инстаграме.

        Пример 3. «Не повторяй!»

        Некоторые могут сказать: «Зачем усложнять? делай как делают лидеры рынка и будет правильно».

        А вот не всегда так. Реальный случай. Работаю над метатегами интернет магазина косметики. Параллельно работает словенская маркетологинья, которая упорно не хочет ставить бренды в названия товаров, но при этом настаивает на том, чтобы там было количество в ml. То есть название звучит примерно так «Лосьон увлажняющий для лица 200 ml», что мне категорически не нравится, потому что не надо быть гением seo, можно быть просто женщиной, чтобы понимать, что если нам какой бренд понравился, то ты сознательно или нет, но в первую очередь будем ему хранить лояльность и искать именно его. Если еще короче, трафик по брендовым запросам в косметике — это святое. А вот миллилитры нет. Поэтому я ее спрашиваю «Zakaj. ». Ответ убил- «потому что все так делают». Смотрю выдачу в Google по Словении и вижу..ба! и правда 80% точно прописывает ml в название и даже крупные игроки рынка, если точнее, то они то так и пишут. Пробиваю частоты запросов с миллилитрами — ну нет так запросов! Да и не может быть. Потому что это не фармакопея и если вместо 200 ml лосьона мне попадется 220 ml, то у меня не будет передоза)) Но я дотошная, я стала искать дальше «почему». И знаете что? С большой долей вероятности причина в дропшипинге. В Словении он тут какой-то повышенный, мало кто имеет свой товар, а покупатели неконфликтные, спокойно могут ждать доставку неделю. Крупные компании сидящие на дропшипинге естественно не вручную заливают товар в CMS, а берут товарный фид от поставщиков…который синхронизирован со складской программой, а там единицы измерения и кол-во! Бинго! Крупняк ставит, остальные, не заморачиваясь сбором семантики, тупо повторяют за крупняком (» Жираф же большой, ему видней»), вот и получается, что вся косметическая интернет отрасль страдает фигней. Мораль — изучать конкурентов, особенно топовых можно и нужно. Не надо тупо повторять за ними: не факт, что их стратегия правильная, возможно свои топовые места они получили за счет других факторов (большого количества обратных ссылок). Включайте мозг, это позволит вам найти слабые места у конкурентов и не повторять их ошибок, а значит получить конкурентное преимущество. А в идеале собирайте свою семантику.

        Лайфхаки года для написания кликабельного Title

        Согласно открытому источнику данных Kaggle «1.4 миллиона историй, собранных из Medium», около 40 000 названий начались со слов «Как». На последней конференции, представитель Semrush, заявил, что тайтлы, оформленные как вопрос, кликаются в 4 раза больше!

        Вот топы идей, как можно начать ваш title:

        ТОП30 начала TITLE

        • Как
        • Что такое
        • Как я
        • Почему я
        • Почему ты
        • Это
        • Ты
        • Что я
        • Лучшее
        • Почему мы
        • Как
        • Вы
        • Будущее
        • Здание
        • я
        • Сила
        • Как мы
        • если ты
        • Что
        • 5 способов
        • Как
        • Познакомиться
        • Большинство
        • Почему
        • Почему
        • Искусство
        • 5 вещей
        • Хочу
        • Что

        Расширенные варианты

        • Как сделать
        • Как получить
        • Как создать
        • Как построить
        • Почему ты должен
        • Сила
        • Как пользоваться
        • Как быть
        • Будущее
        • Что я выучил
        • Искусство
        • Важность
        • Что это
        • 5 способов
        • Как ты
        • Начало работы с
        • Как написать
        • Открытое письмо
        • Как стать
        • Как найти
        • Как купить
        • Что делать
        • Что такое
        • Как начать
        • Письмо к
        • 3 способа
        • Вот как
        • Введение в
        • На этой неделе

        Это слова, которые больше всего резонировали с читателями Medium. И это логично, т.к. у нас у всех есть стремление узнавать что-то новое, чей-то опыт, приемы, лайфхаки, которые сэкономят НАМ время и деньги. Конечно же, не стоит начинать все свои заголовки так, я просто сообщаю статистику, а дальше включайте разум..)

        «Почему в выдаче мои заголовки выглядят иначе? «

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

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

        Особое внимание при формировании сниппета уделяется Title и Description. И здесь не все так просто.

        В 2019 году элемент заголовка HTML, который вы выбираете для своей страницы, может не совпадать с тем, что Google покажет в SERP . В настоящее время заголовок и описание фрагмента поиска сильно зависят от QUERY & DEVICE (запроса и устройства). Google часто выбирает то , что он думает , что является наиболее значимым названием для поиска фрагмента кода, и он может использовать информацию с вашей страницы, или в ссылках на эту страницу, чтобы создать очень другое название SERP сниппета. Цитирую:

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

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

        Полный текст тут

        Согласно исследованию Moz Analysis Google использует Description для формирования сниппета только в 55% случаев. При этом, полностью (без урезания и добавления) Description использовался только в 35.9% случаев.

        Наверное это достаточно неприятный сюрприз, когда вы долго заполняли поля Title и Description, ваш seo плагин Yoast даже вам показывал зеленый свет…а в реальности в выдаче Google показывает совсем другое. В 2019 поисковики знают лучше, что нужно пользователям. Если с точки зрения Google или Bing, ваш заголовок «искажен», то Google будет использовать следующий доступный заголовок из H1, H2, H3, H4, H5 или H6…а потом перейдет к абзацам текстового контента BODY и тегам ALT.

        Примите эту информацию к сведению. Либо ваш Title нерелевантен контенту страницы, либо скажите Google спасибо, он старается для вас, подстраивает вашу выдачу под запрос клиента :).

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

        Update от октября 2021.

        Новые правила от Google позволяют поправлять ошибки в title.

        Пример. На странице учебного центра из года в год публикуется однотипная информация, но поскольку тег не был обновлен, он устарел и перестал соответствовать тексту, например

        Лингвистический центр – Правила приема на курсы на 2020 год

        При этом в тесте на самой странице информация была обновлена и есть хорошо заметный заголовок «Правила приема на курсы на 2021 год», но контент-менеджер забыл поправить дату в меатеге на 2021. Обнаружив такое несоответствие, Google Поиск создаст заголовок ссылки с правильной датой:

        «Лингвистический центр – Правила приема на курсы на 2021 год»

        Здорово, правда? Хотя лучше, конечно, не забывать и оправлять и title.

        Сайт администрирования Django ¶

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

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

        В этом документе мы покажем, как активировать, использовать и настроить интерфейс администратора Django.

        Предварительный просмотр ¶

        Администрирование включено в шаблоне проекта по умолчанию, используемом startproject .

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

        1. Добавить ‘django.contrib.admin’ и зависимость -: django.contrib.auth , django.contrib.contenttypes , django.contrib.messages и django.contrib.sessions — к вашей обстановке INSTALLED_APPS .
        2. Настройка DjangoTemplates бэкенд в вашей TEMPLATES обстановке с django.contrib.auth.context_processors.auth , django.contrib.messages.context_processors.request и django.contrib.messages.context_processors.messages в ‘context_processors’ опции OPTIONS .

        Изменено в Django 3.1: django.contrib.messages.context_processors.request был добавлен как требование в ‘context_processors’ опции поддержки нового AdminSite.enable_nav_sidebar .

        Выполнив эти действия, вы сможете использовать сайт администрирования, посетив URL-адрес, к которому вы его прикрепили ( /admin/ по умолчанию).

        Если вам нужно создать пользователя для входа, используйте команду createsuperuser . По умолчанию для подключения к сайту администрирования требуется, чтобы один из атрибутов is_superuser или is_staff был отмечен ( True ).

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

        Другие темы ¶

        • Действия администрации
        • Генератор административной документации Django
        • Настройки JavaScript в интерфейсе администрирования

        Дополнительные сведения о том, как обслуживать статические файлы (изображения, JavaScript и CSS), связанные с рабочим сайтом администратора, см. В разделе Файловая служба .

        Объекты ModelAdmin ¶

        класс ModelAdmin ¶

        Класс ModelAdmin — это представление модели в интерфейсе администрирования. Обычно эти классы хранятся в именованном файле admin.py в вашем приложении. Давайте посмотрим на пример ModelAdmin :

        from django.contrib import admin from myproject.myapp.models import Author class AuthorAdmin(admin.ModelAdmin): pass admin.site.register(Author, AuthorAdmin) 

        Вам действительно нужен предмет ModelAdmin ?

        В предыдущем примере класс ModelAdmin (пока) не определяет никаких пользовательских значений. В результате будет предоставлен интерфейс администрирования по умолчанию. Если вас это устраивает, вам вообще не нужно определять объект ModelAdmin — вы можете зарегистрировать класс модели, не предоставляя описание типа ModelAdmin . Предыдущий пример можно упростить до:

        from django.contrib import admin from myproject.myapp.models import Author admin.site.register(Author) 

        Декоратор register ¶

        register ( * модели , сайт = django.contrib.admin.sites.site ) ¶

        Также есть декоратор для регистрации классов ModelAdmin :

        from django.contrib import admin from .models import Author @admin.register(Author) class AuthorAdmin(admin.ModelAdmin): pass 

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

        from django.contrib import admin from .models import Author, Editor, Reader from myproject.admin_site import custom_admin_site @admin.register(Author, Reader, Editor, site=custom_admin_site) class PersonAdmin(admin.ModelAdmin): pass 

        Вы не можете использовать этот декоратор, если необходимо обратиться к классу администрирования шаблона в методе __init__() , например. , Вы можете использовать . super(PersonAdmin, self).__init__(*args, **kwargs) super().__init__(*args, **kwargs)

        Обнаружение файлов администрирования ¶

        Когда вы размещаете ‘django.contrib.admin’ свои настройки INSTALLED_APPS , Django автоматически ищет модуль admin в каждом приложении и импортирует его.

        класс apps. AdminConfig ¶

        Это класс AppConfig по умолчанию для администрирования. Он вызывается autodiscover() при запуске Django.

        класс apps. SimpleAdminConfig ¶

        Этот класс работает вроде AdminConfig , но не вызывает autodiscover() .

        Путь импорта с указанным синтаксисом в класс сайта администрирования по умолчанию или исполняемый объект, возвращающий экземпляр сайта. По умолчанию это ‘django.contrib.admin.sites.AdminSite’ . См. Инструкции по использованию в разделе Перегрузка сайта администратора по умолчанию .

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

        Обычно вам не нужно вызывать эту функцию напрямую, потому что она AdminConfig вызывает ее при запуске Django.

        Если вы используете AdminSite обычай, обычно все подклассы импортируются ModelAdmin в его код и регистрируются на AdminSite настраиваемом сайте . В этом случае и для того, чтобы отключить автоматическое обнаружение, речь идет о замене ‘django.contrib.admin’ на ‘django.contrib.admin.apps.SimpleAdminConfig’ в настройке INSTALLED_APPS .

        ¶ варианты ModelAdmin

        ModelAdmin очень гибкий класс. У него есть несколько опций для настройки интерфейса. Все параметры устанавливаются на подклассе ModelAdmin :

        from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): date_hierarchy = 'pub_date' 

        ModelAdmin. actions ¶

        Список действий, доступных на странице списка для изменения. См. Дополнительные сведения в разделе « Административные действия» .

        ModelAdmin. actions_on_top ¶ ModelAdmin. actions_on_bottom ¶

        Управляет отображением панели действий на странице. По умолчанию на странице списка административных правок действия отображаются вверху страницы ( ). actions_on_top = True; actions_on_bottom = False

        Управляет отображением счетчика выбора рядом с раскрывающимся списком действий. По умолчанию страница списка административных правок будет отображать его ( ). actions_selection_counter = True

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

        date_hierarchy = 'pub_date' 

        Также можно указать поле связанной модели, используя синтаксис доступа __ , например:

        date_hierarchy = 'author__pub_date' 

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

        date_hierarchy использует QuerySet.datetimes() внутренне. Если включена поддержка часовых поясов, см. Документацию к нему ( ). USE_TZ = True

        ModelAdmin. empty_value_display ¶

        Этот атрибут переопределяет отображаемое значение по умолчанию для пустых полей записи ( None , пустой строки и т. Д.). По умолчанию — (прочерк). Например :

        from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): empty_value_display = '-empty-' 

        Вы также можете переопределить empty_value_display для всех административных страниц AdminSite.empty_value_display или для определенных полей, например:

        from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): fields = ('name', 'title', 'view_birth_date') def view_birth_date(self, obj): return obj.birth_date view_birth_date.empty_value_display = '. ' 

        ModelAdmin. exclude ¶

        Этот атрибут, если он указан, должен быть списком имен полей, которые нужно исключить из формы.

        Например, рассмотрим следующую модель:

        from django.db import models class Author(models.Model): name = models.CharField(max_length=100) title = models.CharField(max_length=3) birth_date = models.DateField(blank=True, null=True) 

        Если вам нужна форма для модели, Author которая включает только поля, name и title вот как вы должны указать fields или exclude :

        from django.contrib import admin class AuthorAdmin(admin.ModelAdmin): fields = ('name', 'title') class AuthorAdmin(admin.ModelAdmin): exclude = ('birth_date',) 

        Поскольку в модели Author всего три поля name , title а birth_date формы, полученные с помощью приведенных выше утверждений, содержат точно такие же поля.

        Используйте этот параметр, fields если вам нужно внести простые изменения в макет формы страниц «добавить» и «изменить», например показать только часть доступных полей, изменить их порядок или сгруппировать их в строки. Например, вы можете определить упрощенную версию формы администратора для шаблона django.contrib.flatpages.models.FlatPage следующим образом:

        class FlatPageAdmin(admin.ModelAdmin): fields = ('url', 'title', 'content') 

        В приведенном выше примере, только поля url , title и content будет отображаться в виде последовательно. fields может содержать значения, определенные в, ModelAdmin.readonly_fields для отображения только для чтения.

        Для более сложной компоновки см. Вариант fieldsets .

        Параметр fields принимает те же типы значений, что и list_display , за исключением того, что исполняемые объекты не допускаются. Имена шаблонов или методов административного шаблона используются, только если они появляются в readonly_fields .

        Чтобы отобразить несколько полей в одной строке, вставьте эти поля в отдельный кортеж. В этом примере поля url и title отображаются в одной строке, а поле content будет отображаться под ними в отдельной строке:

        class FlatPageAdmin(admin.ModelAdmin): fields = (('url', 'title'), 'content') 

        Эту опцию fields не следует путать с ключом словаря, fields присутствующим в опции fieldsets , как описано в следующем разделе.

        Если ни параметр, fields ни параметр fieldsets отсутствуют, Django по умолчанию отображает каждое поле, которое не является одним AutoField и которое имеет editable=True уникальную группу полей и в том же порядке определения полей, что и в шаблоне.

        Установите fieldsets для управления макетом страниц администрирования «добавить» и «изменить».

        fieldsets представляет собой список двоичных кортежей, где каждый кортеж представляет тег на странице административной формы ( является «разделом» формы).

        Двоичные кортежи имеют формат , где — строка, представляющая заголовок группы полей, и словарь информации о группе полей, включая список полей для отображения внутри. (nom, options_champs) nom options_champs

        from django.contrib import admin class FlatPageAdmin(admin.ModelAdmin): fieldsets = ( (None,  'fields': ('url', 'title', 'content', 'sites') >), ('Advanced options',  'classes': ('collapse',), 'fields': ('registration_required', 'template_name'), >), ) 

        В результате открывается страница администрирования, которая выглядит так:

        ../../../_images/fieldsets.png

        Если ни параметр, fieldsets ни параметр fields отсутствуют, Django по умолчанию отображает каждое поле, которое не является одним AutoField и которое имеет editable=True уникальную группу полей и в том же порядке определения полей, что и в шаблоне.

        Словарь field_options может содержать следующие ключи:

          fields Кортеж имен полей, отображаемых в этой группе полей. Этот ключ обязателен. Пример:

         'fields': ('first_name', 'last_name', 'address', 'city', 'state'), > 

        Что касается опции fields , вы можете отобразить несколько полей в одной строке, включив их в кортеж. В этом примере, first_name и поля last_name отображаются на той же строке:

         'fields': (('first_name', 'last_name'), 'address', 'city', 'state'), > 
         'classes': ('wide', 'extrapretty'), > 

        По умолчанию ManyToManyField на сайте администрирования поле отображается с расширением . Однако при выборе большого количества элементов может быть сложно использовать поля с множественным выбором. Если добавить поле в этот список, это поле будет заменено незаметным и умным «фильтрующим» интерфейсом JavaScript, позволяющим выполнять поиск по параметрам. Невыбранные и выбранные параметры отображаются в двух полях рядом. См. Использование вертикального интерфейса. ManyToManyField filter_vertical

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

        По умолчанию форма ModelForm для моделей создается динамически. Он используется для создания формы, представленной на страницах добавления / редактирования. Вы можете легко предоставить свой собственный, ModelForm чтобы переопределить любую форму поведения по умолчанию на страницах добавления / редактирования. В качестве альтернативы вы можете настроить форму по умолчанию, а не определять совершенно новую с помощью метода ModelAdmin.get_form() .

        Если вы определяете атрибут Meta.model в a ModelForm , вы также должны определить атрибут Meta.fields (или атрибут Meta.exclude ). Однако, поскольку у администрации есть собственный способ определения полей, атрибут Meta.fields будет проигнорирован.

        Если ModelForm он предназначен только для администрирования, самое простое решение — опустить атрибут Meta.model , так как ModelAdmin он предоставит правильный шаблон для использования. Также можно определить в классе , чтобы удовлетворить проверку . fields = [] Meta ModelForm

        Если классы ModelForm и оба ModelAdmin определяют вариант exclude , ModelAdmin преобладает:

        from django import forms from django.contrib import admin from myapp.models import Person class PersonForm(forms.ModelForm): class Meta: model = Person exclude = ['name'] class PersonAdmin(admin.ModelAdmin): exclude = ['age'] form = PersonForm 

        В приведенном выше примере поле «возраст» будет исключено, но поле «имя» будет включено в сгенерированную форму.

        ModelAdmin. formfield_overrides ¶

        Этот атрибут предоставляет «поспешное» решение для отмены некоторых параметров, Field используемых в интерфейсе администрирования. formfield_overrides — словарь, связывающий класс поля со словарем параметров, которые должны быть переданы в указанное поле во время его создания.

        Поскольку это немного абстрактно, давайте посмотрим на пример из реальной жизни. Чаще всего используется formfield_overrides для добавления настраиваемого компонента для определенного типа поля. Итак, допустим, мы написали компонент, RichTextEditorWidget который хотели бы использовать для расширенных текстовых полей вместо стандартного. Вот как мы могли это сделать:

        from django.contrib import admin from django.db import models # Import our custom widget and our model from where they're defined from myapp.models import MyModel from myapp.widgets import RichTextEditorWidget class MyModelAdmin(admin.ModelAdmin): formfield_overrides =  models.TextField: 'widget': RichTextEditorWidget>, > 

        Обратите внимание, что ключ в словаре — это фактический класс поля, а не строка. Значение — это другой словарь; эти параметры будут переданы методу __init__() поля формы. Подробнее см. В API форм .

        Если вы хотите использовать настраиваемый компонент с полем отношения (например, ForeignKey или ManyToManyField ), убедитесь, что вы не включили имя этого поля в raw_id_fields , radio_fields или autocomplete_fields .

        formfield_overrides не позволит вам изменить поля отношений компонента, содержащиеся в raw_id_fields , radio_fields или autocomplete_fields . Это происходит потому , что raw_id_fields , radio_fields и autocomplete_fields уже включает в себя использование пользовательских компонентов.

        ModelAdmin. inlines ¶

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

        list_display = ('first_name', 'last_name') 

        Если list_display не определен, на сайте администрирования будет отображаться один столбец с представлением __str__() каждого объекта.

        list_display может содержать четыре разных типа значений:

          Имя поля шаблона. Например :

        class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name') 
        def upper_case_name(obj): return ("%s %s" % (obj.first_name, obj.last_name)).upper() upper_case_name.short_description = 'Name' class PersonAdmin(admin.ModelAdmin): list_display = (upper_case_name,) 
        class PersonAdmin(admin.ModelAdmin): list_display = ('upper_case_name',) def upper_case_name(self, obj): return ("%s %s" % (obj.first_name, obj.last_name)).upper() upper_case_name.short_description = 'Name' 
        from django.contrib import admin from django.db import models class Person(models.Model): name = models.CharField(max_length=50) birthday = models.DateField() def decade_born_in(self): return self.birthday.strftime('%Y')[:3] + "0's" decade_born_in.short_description = 'Birth decade' class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'decade_born_in') 

        Некоторые особые случаи, о которых следует сообщить list_display :

        • Если это поле является ключевым ForeignKey , Django отобразит __str__() соответствующий объект.
        • Поля ManyToManyField не поддерживаются, потому что это потребует выполнения оператора SQL для каждой строки в таблице. Если вы все еще хотите сделать это, дайте вашей модели собственный метод и добавьте имя этого метода в list_display . (См. Ниже дополнительные сведения о пользовательских методах в list_display .)
        • Если поле равно единице BooleanField , Django отображает красивый активный / неактивный значок вместо значений True или False .
        • Если данная строка является методом модели, ModelAdmin исполняемым объектом или объектом, Django по умолчанию экранирует результирующий HTML-результат. Чтобы избежать введенных пользователем данных и разрешить использование собственных тегов без экранирования, используйте format_html() . Вот полный образец модели:

        from django.contrib import admin from django.db import models from django.utils.html import format_html class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) def colored_name(self): return format_html( '<>;"><> <> ', self.color_code, self.first_name, self.last_name, ) class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'colored_name') 
        from django.contrib import admin admin.site.empty_value_display = '(None)' 

        Вы также можете использовать ModelAdmin.empty_value_display :

        class PersonAdmin(admin.ModelAdmin): empty_value_display = 'unknown' 

        Или на полевом уровне:

        class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'birth_date_view') def birth_date_view(self, obj): return obj.birth_date birth_date_view.empty_value_display = 'unknown' 
        from django.contrib import admin from django.db import models class Person(models.Model): first_name = models.CharField(max_length=50) birthday = models.DateField() def born_in_fifties(self): return self.birthday.strftime('%Y')[:3] == '195' born_in_fifties.boolean = True class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'born_in_fifties') 
        list_display = ('__str__', 'some_other_field') 
        from django.contrib import admin from django.db import models from django.utils.html import format_html class Person(models.Model): first_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) def colored_first_name(self): return format_html( '<>;"><> ', self.color_code, self.first_name, ) colored_first_name.admin_order_field = 'first_name' class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'colored_first_name') 

        Вышеупомянутое говорит Django сортировать по полю first_name при попытке сортировки colored_first_name в админке. Чтобы указать порядок убывания с помощью admin_order_field , вы можете поставить перед именем поля дефис. В приведенном выше примере это будет выглядеть так:

        colored_first_name.admin_order_field = '-first_name' 

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

        class Blog(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(Person, on_delete=models.CASCADE) class BlogAdmin(admin.ModelAdmin): list_display = ('title', 'author', 'author_first_name') def author_first_name(self, obj): return obj.author.first_name author_first_name.admin_order_field = 'author__first_name' 

        Эти выражения запроса могут быть использованы admin_order_field . например

        from django.db.models import Value from django.db.models.functions import Concat class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) def full_name(self): return self.first_name + ' ' + self.last_name full_name.admin_order_field = Concat('first_name', Value(' '), 'last_name') 
        class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) def my_property(self): return self.first_name + ' ' + self.last_name my_property.short_description = "Full name of the person" my_property.admin_order_field = 'last_name' full_name = property(my_property) class PersonAdmin(admin.ModelAdmin): list_display = ('full_name',) 
        • Модельное поле.
        • Исполняемый объект.
        • Строка, представляющая атрибут ModelAdmin .
        • Строка, представляющая атрибут модели.

        Например, если first_name это и поле шаблона, и атрибут ModelAdmin , будет использоваться поле шаблона.

        Используйте list_display_links для управления, если есть, какие поля list_display должны ссылаться на страницу редактирования объекта.

        По умолчанию список для страницы редактирования связывает первый столбец — первое поле в list_display — со страницей редактирования каждого элемента. Но list_display_links давайте изменим это:

        • Установите его None так, чтобы ссылка не появлялась.
        • Задайте для него список или кортеж полей (в том же формате, что и list_display ), столбцы которых должны быть преобразованы в ссылки. Вы можете указать одно или несколько полей. Пока поля появляются list_display , Django не заботится о том, сколько (или как) полей связаны. Единственное требование — если вы хотите использовать его list_display_links таким образом, вы должны установить list_display .

        В этом примере, first_name и поля last_name будут одновременно выступать в качестве ссылки на странице списка для редактирования:

        class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'birthday') list_display_links = ('first_name', 'last_name') 

        В этом примере список для страницы редактирования не имеет ссылки:

        class AuditEntryAdmin(admin.ModelAdmin): list_display = ('timestamp', 'message') list_display_links = None 

        ModelAdmin. list_editable ¶

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

        list_editable уникальным образом взаимодействует с рядом других опций; вы должны соблюдать следующие правила:

        • Любое поле в list_editable также должно появиться в list_display . Вы не можете изменить поле, которое не отображается!
        • Одно и то же поле не может быть определено одновременно внутри list_editable и внутри list_display_links — поле не может быть одновременно формой и ссылкой.

        Вы получите ошибку проверки, если какое-либо из этих правил нарушено.

        ModelAdmin. list_filter ¶

        Установите list_filter для включения фильтров на правой панели страницы списка редактирования администратора, как показано на следующем снимке экрана:

        ../../../_images/list_filter.png

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

          имя поля, где поле должно быть или BooleanField , CharField , DateField , DateTimeField , IntegerField , ForeignKey или ManyToManyField ; например :

        class PersonAdmin(admin.ModelAdmin): list_filter = ('is_staff', 'company') 

        Имена полей в list_filter также могут распространяться на отношения с использованием синтаксиса поиска __ , например:

        class PersonAdmin(admin.UserAdmin): list_filter = ('company__name',) 
        from datetime import date from django.contrib import admin from django.utils.translation import gettext_lazy as _ class DecadeBornListFilter(admin.SimpleListFilter): # Human-readable title which will be displayed in the # right admin sidebar just above the filter options. title = _('decade born') # Parameter for the filter that will be used in the URL query. parameter_name = 'decade' def lookups(self, request, model_admin): """ Returns a list of tuples. The first element in each tuple is the coded value for the option that will appear in the URL query. The second element is the human-readable name for the option that will appear in the right sidebar. """ return ( ('80s', _('in the eighties')), ('90s', _('in the nineties')), ) def queryset(self, request, queryset): """ Returns the filtered queryset based on the value provided in the query string and retrievable via `self.value()`. """ # Compare the requested value (either '80s' or '90s') # to decide how to filter the queryset. if self.value() == '80s': return queryset.filter(birthday__gte=date(1980, 1, 1), birthday__lte=date(1989, 12, 31)) if self.value() == '90s': return queryset.filter(birthday__gte=date(1990, 1, 1), birthday__lte=date(1999, 12, 31)) class PersonAdmin(admin.ModelAdmin): list_filter = (DecadeBornListFilter,) 

        Заметка Для удобства объект HttpRequest передается в методы lookups и queryset , например:

        class AuthDecadeBornListFilter(DecadeBornListFilter): def lookups(self, request, model_admin): if request.user.is_superuser: return super().lookups(request, model_admin) def queryset(self, request, queryset): if request.user.is_superuser: return super().queryset(request, queryset) 

        Также для удобства объект ModelAdmin передается в метод lookups , например, если вы хотите установить фильтры из доступных данных:

        class AdvancedDecadeBornListFilter(DecadeBornListFilter): def lookups(self, request, model_admin): """ Only show the lookups if there actually is anyone born in the corresponding decades. """ qs = model_admin.get_queryset(request) if qs.filter(birthday__gte=date(1980, 1, 1), birthday__lte=date(1989, 12, 31)).exists(): yield ('80s', _('in the eighties')) if qs.filter(birthday__gte=date(1990, 1, 1), birthday__lte=date(1999, 12, 31)).exists(): yield ('90s', _('in the nineties')) 
        class PersonAdmin(admin.ModelAdmin): list_filter = ( ('is_staff', admin.BooleanFieldListFilter), ) 

        Вы можете ограничить выбор связанной модели объектами, на которые влияет отношение, используя RelatedOnlyFieldListFilter :

        class BookAdmin(admin.ModelAdmin): list_filter = ( ('author', admin.RelatedOnlyFieldListFilter), ) 

        Предполагая, что author это ключ ForeignKey к шаблону User , это ограничит выбор list_filter пользователями, которые написали книгу, вместо того, чтобы перечислять всех пользователей. Вы можете фильтровать пустые значения, используя EmptyFieldListFilter , который может фильтровать как пустые строки, так и нули, в зависимости от того, что поле позволяет хранить:

        class BookAdmin(admin.ModelAdmin): list_filter = ( ('title', admin.EmptyFieldListFilter), ) 

        Заметка API FieldListFilter считается внутренним и может измениться.
        Новое в Django 3.1: EmptyFieldListFilter Класс был добавлен.

        Фильтры списка появляются только тогда, когда у фильтра есть более одного варианта. Метод has_output() фильтрации проверяет это условие.

        Можно указать собственный шаблон для отображения фильтра списка:

        class FilterWithCustomTemplate(admin.SimpleListFilter): template = "custom_template.html" 

        См. admin/filter.html Конкретный пример в шаблоне по умолчанию, предоставляемом Django ( ).

        Установите, list_max_show_all чтобы контролировать количество элементов, которые могут отображаться на странице редактирования административного списка «Показать все». Администрация отображает ссылку «Показать все» в списке для изменения, только если общее количество результатов меньше или равно значению этого атрибута. По умолчанию для этого параметра установлено значение 200 .

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

        Установите, list_select_related чтобы указать Django использовать его select_related() при получении списка объектов на странице списка для модификации администратором. Это может сэкономить вам много запросов к базе данных.

        Значение может быть логическим, списком или кортежем. По умолчанию это False .

        Когда значение равно True , select_related() всегда будет вызываться. Если установлено значение False , Django проверяет list_display и вызывает select_related() только при наличии ключа ForeignKey .

        Если вам нужен более детальный контроль, используйте кортеж (или список) в качестве значения list_select_related . Пустой кортеж select_related в любом случае предотвратит вызов Django . Любой другой кортеж будет передан напрямую в select_related качестве параметров. Например :

        class ArticleAdmin(admin.ModelAdmin): list_select_related = ('author', 'category') 

        позвоню . select_related(‘author’, ‘category’)

        Если вам нужно установить динамическое значение на основе запроса, вы можете реализовать метод get_list_select_related() .

        ModelAdmin игнорируйте этот атрибут, если select_related() он уже был вызван для запроса QuerySet списка на изменение.

        ModelAdmin. ordering ¶

        Определите, ordering чтобы указать, как следует упорядочивать списки объектов в представлениях администратора Django. Значение должно быть списком или кортежем в том же формате, что и параметр шаблона ordering .

        Если этот параметр не заполнен, администрация Django использует порядок сортировки модели по умолчанию.

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

        Соображения производительности для сортировки

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

        Например, если по умолчанию используется nom неуникальное поле , список для изменения будет отсортирован по nom и pk . Это может снизить производительность, если есть много результатов и нет индекса для name и pk .

        ModelAdmin. paginator ¶

        Класс разбивки на страницы, используемый для разбивки на страницы. По умолчанию django.core.paginator.Paginator используется. Если настраиваемый класс разбиения на страницы не имеет того же интерфейса конструктора django.core.paginator.Paginator , что и, необходимо также предоставить реализацию для ModelAdmin.get_paginator() .

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

        class ArticleAdmin(admin.ModelAdmin): prepopulated_fields = "slug": ("title",)> 

        Когда этот атрибут установлен, указанные поля будут использовать некоторый JavaScript для предварительного заполнения из указанных полей. Основное использование этой функции — автоматическое генерирование значений полей SlugField из одного или нескольких других полей. Сгенерированное значение создается путем объединения значений исходных полей, а затем преобразования этого результата в короткую и действительную метку, «slug» (например, замена пробелов на тире, уменьшение букв ASCII или удаление определенных английских стоп-слов, таких как «a», «an», «as»).

        Предварительно заполненные поля не изменяются JavaScript после сохранения значения. Обычно нежелательно, чтобы «слаг» изменялся (что привело бы к изменению URL-адреса объекта, если слаг является его частью).

        prepopulated_fields не принимает полей DateTimeField , ForeignKey , OneToOneField или ManyToManyField .

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

        По умолчанию интерфейс администратора Django использует интерфейс окна выбора () для полей ForeignKey или тех, для которых установлен атрибут choices . Если поле присутствует в radio_fields , Django вместо этого использует интерфейс переключателя. Предполагая, что group это ключ ForeignKey к модели Person :

        class PersonAdmin(admin.ModelAdmin): radio_fields = "group": admin.VERTICAL> 

        У вас есть выбор: использовать HORIZONTAL или VERTICAL модуль django.contrib.admin .

        radio_fields Включайте поле, только если оно является полем ForeignKey или его атрибут choices установлен.

        autocomplete_fields представляет собой список полей ForeignKey и / или ManyToManyField которые вы хотите преобразовать в самозаполненные компоненты Select2 .

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

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

        Вы должны определить search_fields в классе ModelAdmin связанного объекта, поскольку поиск автозаполнения использует его.

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

        Сортировка и разбиение на страницах результатов контролируются с помощью методов get_ordering() и get_paginator() в ModelAdmin соответствующей ссылке.

        В следующем примере, ChoiceAdmin имеет автозавершенное поле для ключа ForeignKey к Question . Результаты фильтруются по полю question_text и сортируются по полю date_created :

        class QuestionAdmin(admin.ModelAdmin): ordering = ['date_created'] search_fields = ['question_text'] class ChoiceAdmin(admin.ModelAdmin): autocomplete_fields = ['question'] 

        Вопросы производительности для больших наборов данных

        Сортировка по ModelAdmin.ordering может вызвать проблемы с производительностью, поскольку сортировка больших объемов данных выполняется медленно.

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

        В этих случаях может быть хорошей идеей написать собственную реализацию ModelAdmin.get_search_results() использования индексированного полнотекстового поиска.

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

        ModelAdmin. raw_id_fields ¶

        По умолчанию интерфейс администратора Django использует для полей интерфейс выбора () ForeignKey . Иногда вы не хотите медлить с выбором всех связанных экземпляров для отображения из раскрывающегося списка.

        raw_id_fields это список полей, которые вы хотите изменить с помощью простого компонента Input , будь то поле ForeignKey или ManyToManyField :

        class ArticleAdmin(admin.ModelAdmin): raw_id_fields = ("newspaper",) 

        Компонент Input из raw_id_fields должен содержать первичный ключ , если поле является ключом ForeignKey или разделенный запятыми список значений , если поле является ManyToManyField . Компонент raw_id_fields имеет кнопку с увеличительным стеклом рядом с полем, которая позволяет пользователям находить и выбирать значение:

        ../../../_images/raw_id_fields.png

        ModelAdmin. readonly_fields ¶

        По умолчанию интерфейс администрирования отображает все поля в редактируемом виде. Все поля, представленные в этой опции (которые должны быть списком или кортежем), будут отображать свои данные как есть, и их нельзя будет изменить; они также будут исключены из формы, ModelForm используемой для создания и редактирования. Обратите внимание: когда вы заполняете ModelAdmin.fields или ModelAdmin.fieldsets , должны присутствовать поля только для чтения, если вы хотите, чтобы они отображались (в противном случае они игнорируются).

        Если readonly_fields используется без явного порядка, определенного с помощью ModelAdmin.fields или ModelAdmin.fieldsets , они будут добавлены последними после всех редактируемых полей.

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

        from django.contrib import admin from django.utils.html import format_html_join from django.utils.safestring import mark_safe class PersonAdmin(admin.ModelAdmin): readonly_fields = ('address_report',) def address_report(self, instance): # assuming get_full_address() returns a list of strings # for each line of the address and you want to separate each # line by a linebreak return format_html_join( mark_safe('
        '
        ), '<>', ((line,) for line in instance.get_full_address()), ) or mark_safe("I can't determine this address.") # short_description functions like a model field's verbose_name address_report.short_description = "Address"

        ModelAdmin. save_as ¶

        Установите, save_as чтобы включить функцию «сохранить как новый» в формах редактирования администрирования.

        Обычно у объектов есть три варианта сохранения: «Сохранить», «Сохранить и продолжить изменения» и «Сохранить и добавить новые». Если save_as установлено значение True «Сохранить и добавить новый», кнопка заменяется на «Сохранить как новый» создает новый объект (с новым идентификатором), а не обновляет существующий объект.

        По умолчанию save_as установлено значение False .

        Когда save_as=True , перенаправление по умолчанию после сохранения нового объекта — это представление для изменения этого объекта. Если вы определите save_as_continue=False , перенаправление будет на просмотр списка для модификации.

        По умолчанию save_as_continue установлено значение True .

        Установите save_on_top для добавления кнопок записи в верхней части форм редактирования администратора.

        Обычно кнопки записи появляются только внизу форм. Если вы установите save_on_top , кнопки появятся как вверху, так и внизу.

        По умолчанию save_on_top установлено значение False .

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

        Эти поля должны иметь текстовый тип, например CharField или TextField . Вы также можете выполнить связанный поиск по ключу ForeignKey или полю ManyToManyField с «реляционной» нотацией Search API:

        search_fields = ['foreign_key__related_fieldname'] 

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

        search_fields = ['user__email'] 

        Когда кто-то выполняет поиск в окне поиска администратора, Django разбивает поисковый запрос на слова и возвращает все объекты, содержащие все слова, без учета регистра (с использованием поиска icontains ), где каждое слово должно быть хотя бы в одном из полей search_fields . Например, если search_fields установлено значение и пользователь ищет , Django выполнит эквивалент этого предложения SQL : [‘first_name’, ‘last_name’] john lennon WHERE

        WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%') AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%') 

        Если вы не хотите использовать поиск icontains , вы можете принудительно выполнить другой поиск, добавив его после поля. Например, можно использовать exact , установив search_fields на [‘first_name__exact’] .

        Имейте в виду, что из-за расстановки переносов в поисковых запросах, которые затем комбинируются с, AND как объяснялось ранее, поиск exact работает только с одним поисковым словом, поскольку не все два или более слов могут быть точными совпадениями (кроме если все слова совпадают).

        Также доступны некоторые (старые) ярлыки для подсказки поиска по полю. Вы можете добавить к полю search_fields следующие символы, которые эквивалентны добавлению __ после поля:

        Префикс Запрос
        ^ startswith
        знак равно iexact
        @ search
        Любой) icontains

        Если вам нужно настроить поиск, вы можете использовать его, ModelAdmin.get_search_results() чтобы предоставить дополнительное или другое поведение поиска.

        Определите, show_full_result_count чтобы определить, должно ли общее количество объектов отображаться на отфильтрованной странице администратора (например ). Если для этого параметра установлено значение , вместо него отображается текст в стиле . 99 résultats (103 au total) False 99 résultats (tout afficher)

        По умолчанию show_full_result_count=True создается запрос об общем количестве объектов в таблице, что может быть дорогостоящим, если таблица содержит большое количество строк.

        По умолчанию на странице списка изменений разрешена сортировка по всем полям модели (и исполняемым объектам, имеющим свойство admin_order_field ), указанным в list_display .

        Если вы хотите отключить сортировку для некоторых столбцов, установите для нее sortable_by коллекцию (например list , tuple или set ), подмножество list_display которой, вероятно, будет отсортировано. Пустая коллекция отключает сортировку для всех столбцов.

        Если вам нужно определить этот список динамически, вы можете реализовать метод get_sortable_by() .

        Установите view_on_site для управления отображением ссылки «Просмотр на сайте». Эта ссылка должна вести на URL-адрес, по которому можно просмотреть зарегистрированный объект.

        Этот атрибут может быть логическим значением или исполняемым объектом. Когда это True (по умолчанию), метод get_absolute_url() объекта используется для генерации URL.

        Если модель имеет метод , get_absolute_url() но вы не хотите, чтобы кнопка «Смотрите на сайте» появляются, все , что вам нужно сделать , это установить view_on_site на False :

        from django.contrib import admin class PersonAdmin(admin.ModelAdmin): view_on_site = False 

        Если это исполняемый объект, он принимает экземпляр модели в качестве параметра. Например :

        from django.contrib import admin from django.urls import reverse class PersonAdmin(admin.ModelAdmin): def view_on_site(self, obj): url = reverse('person-detail', kwargs='slug': obj.slug>) return 'https://example.com' + url 
        Параметры настраиваемого шаблона ¶

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

        Путь к настраиваемому шаблону, используемому add_view() .

        Путь к настраиваемому шаблону, используемому change_view() .

        Путь к настраиваемому шаблону, используемому changelist_view() .

        Путь к настраиваемому шаблону, используемый delete_view() для отображения страницы подтверждения при удалении одного или нескольких объектов.

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

        Путь к настраиваемому шаблону, используемому history_view() .

        Методы ModelAdmin ¶

        Когда вы отменяете ModelAdmin.save_model() и методы ModelAdmin.delete_model() , код должен сохранить, соответственно удалить объект. Они не предназначены для целей вето, а скорее позволяют выполнять дополнительные операции.

        ModelAdmin. save_model ( запрос , объект , форма , изменение ) ¶

        Метод save_model получает запрос HttpRequest , экземпляр модели, экземпляр ModelForm и логическое значение, указывающее, добавляет ли он или изменяет объект. Перегрузка этого метода позволяет выполнять операции до или после записи. Вызовите super().save_model() для сохранения объекта Model.save() .

        Например, чтобы привязать пользователя request.user к объекту перед сохранением:

        from django.contrib import admin class ArticleAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.user = request.user super().save_model(request, obj, form, change) 

        ModelAdmin. delete_model ( запрос , объект ) ¶

        Метод delete_model получает запрос HttpRequest и экземпляр модели. Перегрузка этого метода позволяет выполнять операции до или после удаления. Вызов super().delete_model() для удаления объекта с помощью Model.delete() .

        ModelAdmin. delete_queryset ( запрос , набор запросов ) ¶

        Метод delete_queryset() получает запрос HttpRequest и набор QuerySet объектов для удаления. Переопределите этот метод, чтобы настроить процесс удаления « Действие « Удалить выбранные объекты ».

        ModelAdmin. save_formset ( запрос , форма , набор форм , изменение ) ¶

        Метод save_formset получает запрос HttpRequest , родительский экземпляр ModelForm и логическое значение, указывающее, добавляет ли он родительский объект или изменяет его.

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

        class ArticleAdmin(admin.ModelAdmin): def save_formset(self, request, form, formset, change): instances = formset.save(commit=False) for obj in formset.deleted_objects: obj.delete() for instance in instances: instance.user = request.user instance.save() formset.save_m2m() 

        ModelAdmin. get_ordering ( запрос ) ¶

        Метод get_ordering получает параметр request и должен возвращать объект list или tuple определять порядок сортировки аналогично атрибуту ordering . Например :

        class PersonAdmin(admin.ModelAdmin): def get_ordering(self, request): if request.user.is_superuser: return ['name', 'rank'] else: return ['name'] 

        ModelAdmin. get_search_results ( запрос , набор запросов , условие_поиска ) ¶

        Метод get_search_results изменяет список отображаемых объектов на основе тех, которые соответствуют указанному поисковому запросу. Он принимает HTTP-запрос, набор запросов, который применяет общие фильтры и поисковый запрос, предоставленный пользователем. Он возвращает кортеж, содержащий измененный набор запросов для применения поиска, а также логическое значение, указывающее, могут ли результаты содержать дубликаты.

        Реализация по умолчанию ищет поля в ModelAdmin.search_fields .

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

        Например, для поиска по name и age вы можете написать:

        class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'age') search_fields = ('name',) def get_search_results(self, request, queryset, search_term): queryset, use_distinct = super().get_search_results(request, queryset, search_term) try: search_term_as_int = int(search_term) except ValueError: pass else: queryset |= self.model.objects.filter(age=search_term_as_int) return queryset, use_distinct 

        Эта реализация более эффективна, чем сравнение строк для числового поля, например, с PostgreSQL. search_fields = (‘name’, ‘=age’) . OR UPPER(«polls_choice».»votes»::text) = UPPER(‘4’)

        ModelAdmin. save_related ( запрос , форма , наборы форм , изменение ) ¶

        Метод save_related получает запрос HttpRequest , родительский экземпляр ModelForm , список встроенных сгруппированных форм и логическое значение, указывающее, добавлен или изменен родительский элемент. Это место для выполнения операций до или после сохранения над объектами, связанными с родительским. Обратите внимание, что на данный момент родительский объект и его форма уже сохранены.

        ModelAdmin. get_autocomplete_fields ( запрос ) ¶

        Метод get_autocomplete_fields() получает запрос HttpRequest и должен возвращать одно list или несколько tuple имен полей, которые будут отображаться с компонентом автозаполнения, как описано выше в разделе ModelAdmin.autocomplete_fields .

        ModelAdmin. get_readonly_fields ( запрос , obj = Нет ) ¶

        Метод get_readonly_fields получает запрос HttpRequest и obj редактируемый объект (или None в форме добавления); он должен возвращать имена объектов list или tuple полей, которые будут отображаться как доступные только для чтения, как описано выше в разделе ModelAdmin.readonly_fields .

        ModelAdmin. get_prepopulated_fields ( запрос , obj = Нет ) ¶

        Метод get_prepopulated_fields получает запрос HttpRequest и obj редактируемый объект (или None в форме добавления); предполагается, что он вернет словарь, как описано выше в разделе ModelAdmin.prepopulated_fields .

        ModelAdmin. get_list_display ( запрос ) ¶

        Метод get_list_display получает запрос HttpRequest и, как ожидается, вернет одно list или несколько tuple имен полей, которые будут отображаться в представлении списка для модификации, как описано выше в разделе ModelAdmin.list_display .

        ModelAdmin. get_list_display_links ( запрос , list_display ) ¶

        Метод get_list_display_links получает запрос HttpRequest и / list или tuple возвращается ModelAdmin.get_list_display() . Предполагается, что для изменения будет возвращено None одно list или одно tuple из имен полей, отображаемых на странице списка, которые будут связаны с представлением редактирования, как описано в разделе ModelAdmin.list_display_links .

        ModelAdmin. get_exclude ( запрос , obj = Нет ) ¶

        Метод get_exclude получает запрос HttpRequest и obj редактируемый объект (или None для формы добавления) и, как ожидается, вернет список полей, как описано в ModelAdmin.exclude .

        ModelAdmin. get_fields ( запрос , obj = Нет ) ¶

        Метод get_fields получает запрос HttpRequest и obj редактируемый объект (или None для формы добавления) и должен возвращать список полей, как описано выше в разделе ModelAdmin.fields .

        ModelAdmin. get_fieldsets ( запрос , obj = Нет ) ¶

        Метод get_fieldsets получает запрос HttpRequest и obj редактируемый объект (или None в форме добавления) и должен возвращать список двоичных кортежей, где каждый кортеж представляет собой раздел на странице формы администратора, например описано выше в разделе ModelAdmin.fieldsets .

        ModelAdmin. get_list_filter ( запрос ) ¶

        Метод get_list_filter получает запрос HttpRequest и должен возвращать ту же последовательность, что и для атрибута list_filter .

        ModelAdmin. get_list_select_related ( запрос ) ¶

        Метод get_list_select_related получает запрос HttpRequest и должен возвращать логическое значение или список list_select_related .

        ModelAdmin. get_search_fields ( запрос ) ¶

        Метод get_search_fields получает запрос HttpRequest и должен возвращать тот же тип последовательности, что и для атрибута search_fields .

        ModelAdmin. get_sortable_by ( запрос ) ¶

        Метод get_sortable_by() получает запрос HttpRequest и , как ожидается , вернуть коллекцию ( list , tuple или set ) имен полей , которые могут быть отсортированы на странице списка для модификации.

        Его реализация по умолчанию возвращается, sortable_by если это определено, в противном случае вызывает get_list_display() .

        Например, чтобы предотвратить сортировку одного или нескольких столбцов

        class PersonAdmin(admin.ModelAdmin): def get_sortable_by(self, request): return *self.get_list_display(request)> - 'rank'> 

        ModelAdmin. get_inline_instances ( запрос , obj = Нет ) ¶

        Метод get_inline_instances получает запрос HttpRequest и obj редактируемый объект (или None в форме добавления) и должен возвращать объект list или tuple сформированные объекты InlineModelAdmin , как описано ниже в разделе InlineModelAdmin . Например, следующий пример возвращает подчиненные формы без фильтрации по умолчанию на основе разрешений на добавление, редактирование, удаление и просмотр:

        class MyModelAdmin(admin.ModelAdmin): inlines = (MyInline,) def get_inline_instances(self, request, obj=None): return [inline(self.model, self.admin_site) for inline in self.inlines] 

        Если вы переопределите этот метод, убедитесь, что возвращаемые подчиненные формы являются экземплярами классов, определенных в inlines , в противном случае вы можете ожидать получения ошибок «Плохой запрос» при добавлении связанных объектов.

        ModelAdmin. get_inlines ( запрос , объект ) ¶

        Новое в Django 3.0.

        Метод get_inlines получает запрос HttpRequest и obj редактируемый объект (или None для формы добавления) и должен возвращать итеративный объект подчиненных форм. Вы можете переопределить этот метод, чтобы динамически добавлять подчиненные формы на основе запроса или экземпляра модели вместо их определения в ModelAdmin.inlines .

        Метод get_urls on one ModelAdmin возвращает URL-адреса, которые будут использоваться для этого, так ModelAdmin же, как и конфигурация URL-адресов. Следовательно, вы можете дополнить их, как описано в разделе Распространение URL :

        from django.contrib import admin from django.template.response import TemplateResponse from django.urls import path class MyModelAdmin(admin.ModelAdmin): def get_urls(self): urls = super().get_urls() my_urls = [ path('my_view/', self.my_view), ] return my_urls + urls def my_view(self, request): # . context = dict( # Include common variables for rendering the admin template. self.admin_site.each_context(request), # Anything else you want in the context. key=value, ) return TemplateResponse(request, "sometemplate.html", context) 

        Если вы хотите использовать макет администратора, обратитесь к admin/base_site.html :

         extends "admin/base_site.html" %>  block content %> .  endblock %> 

        Обратите внимание, что пользовательские шаблоны включаются перед обычными URL-адресами администратора: шаблоны URL-адресов администратора очень разрешены и соответствуют практически чему угодно, поэтому пользовательские URL-адреса предшествуют встроенным шаблонам.

        В этом примере my_view он будет доступен /admin/myapp/mymodel/my_view/ (при условии, что URL-адреса администратора включены в /admin/ ).

        Однако у self.my_view зарегистрированной выше функции есть две проблемы:

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

        Поскольку обычно это не то, что нужно, Django предоставляет удобный адаптер для проверки разрешений и отметки представления, чтобы избежать кеширования. Этот адаптер находится AdminSite.admin_view() (то есть self.admin_site.admin_view внутри экземпляра ModelAdmin ); используйте его следующим образом:

        class MyModelAdmin(admin.ModelAdmin): def get_urls(self): urls = super().get_urls() my_urls = [ path('my_view/', self.admin_site.admin_view(self.my_view)) ] return my_urls + urls 

        Обратите внимание на адаптированный вид в пятой строке выше.

        path('my_view/', self.admin_site.admin_view(self.my_view)) 

        Эта адаптация защищает self.my_view от несанкционированного доступа и заставляет декоратор django.views.decorators.cache.never_cache() гарантировать, что он не кэшируется в случае, если промежуточное ПО кэширования активно.

        Если страницу можно кэшировать, но вы все равно хотите выполнить проверку разрешений, вы можете передать параметр cacheable=True в AdminSite.admin_view() :

        path('my_view/', self.admin_site.admin_view(self.my_view, cacheable=True)) 

        Представления ModelAdmin имеют атрибуты model_admin . У других представлений AdminSite есть атрибуты admin_site .

        ModelAdmin. get_form ( запрос , obj = None , ** kwargs ) ¶

        Возвращает класс , ModelForm используемый в представлениях администрации добавлять и редактировать см add_view() и change_view() .

        Базовая реализация использует modelform_factory() как подкласс form , измененный такими атрибутами, как fields и exclude . Так, например, если вы хотите добавить дополнительные поля для суперпользователей, можно было бы вставить другую базовую форму, например:

        class MyModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): if request.user.is_superuser: kwargs['form'] = MySuperuserForm return super().get_form(request, obj, **kwargs) 

        Также возможно напрямую вернуть ModelForm собственный класс .

        ModelAdmin. get_formsets_with_inlines ( запрос , obj = Нет ) ¶

        Создает пары ( FormSet , InlineModelAdmin ), используемые в административных представлениях добавления и редактирования.

        Например, если вы хотите отобразить определенную подчиненную форму и только в режиме редактирования, вы можете переопределить get_formsets_with_inlines следующим образом

        class MyModelAdmin(admin.ModelAdmin): inlines = [MyInline, SomeOtherInline] def get_formsets_with_inlines(self, request, obj=None): for inline in self.get_inline_instances(request, obj): # hide MyInline in the add view if not isinstance(inline, MyInline) or obj is not None: yield inline.get_formset(request, obj), inline 

        ModelAdmin. formfield_for_foreignkey ( db_field , запрос , ** kwargs ) ¶

        Метод formfield_for_foreignkey из ModelAdmin эффективно перекрывает поле формы по умолчанию для внешнего ключа поля. Например, чтобы вернуть подмножество объектов из этого поля внешнего ключа на основе пользователя:

        class MyModelAdmin(admin.ModelAdmin): def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "car": kwargs["queryset"] = Car.objects.filter(owner=request.user) return super().formfield_for_foreignkey(db_field, request, **kwargs) 

        В этом примере экземпляр используется HttpRequest для фильтрации поля внешнего ключа, Car чтобы отображались только автомобили, принадлежащие экземпляру User .

        Для более сложных фильтров вы можете использовать метод ModelForm.__init__() фильтрации по одной instance из моделей (см. Поля, посвященные отношениям ). например

        class CountryAdminForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['capital'].queryset = self.instance.cities.all() class CountryAdmin(admin.ModelAdmin): form = CountryAdminForm 

        ModelAdmin. formfield_for_manytomany ( db_field , запрос , ** kwargs ) ¶

        Как и метод formfield_for_foreignkey , метод formfield_for_manytomany может быть переопределен, чтобы изменить поле формы по умолчанию для поля «многие ко многим». Например, если владелец может владеть несколькими автомобилями, а автомобили могут принадлежать нескольким владельцам (отношение «многие ко многим»), вы можете отфильтровать поле внешнего ключа, Car чтобы отображать только автомобили, принадлежащие пользователю User :

        class MyModelAdmin(admin.ModelAdmin): def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == "cars": kwargs["queryset"] = Car.objects.filter(owner=request.user) return super().formfield_for_manytomany(db_field, request, **kwargs) 

        ModelAdmin. formfield_for_choice_field ( db_field , запрос , ** kwargs ) ¶

        Как formfield_for_foreignkey и методы и formfield_for_manytomany , этот метод formfield_for_choice_field можно переопределить, чтобы изменить поле формы по умолчанию на поле с определенным выбором. Например, если варианты выбора, доступные суперпользователю, должны отличаться от доступных для обычных пользователей, вы можете сделать следующее:

        class MyModelAdmin(admin.ModelAdmin): def formfield_for_choice_field(self, db_field, request, **kwargs): if db_field.name == "status": kwargs['choices'] = ( ('accepted', 'Accepted'), ('denied', 'Denied'), ) if request.user.is_superuser: kwargs['choices'] += (('ready', 'Ready for deployment'),) return super().formfield_for_choice_field(db_field, request, **kwargs) 

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

        ModelAdmin. get_changelist ( просьба , ** kwargs ) ¶

        Возвращает класс Changelist для использования в списке редактирования. По умолчанию это класс django.contrib.admin.views.main.ChangeList . Унаследовав от этого класса, вы можете изменить поведение списка редактирования.

        ModelAdmin. get_changelist_form ( просьба , ** kwargs ) ¶

        Возвращает класс, ModelForm используемый в форме, установленной на странице списка для модификации. Чтобы использовать настраиваемую форму, например:

        from django import forms class MyForm(forms.ModelForm): pass class MyModelAdmin(admin.ModelAdmin): def get_changelist_form(self, request, **kwargs): return MyForm 

        Если вы устанавливаете атрибут Meta.model формы ModelForm , вы также должны установить атрибут Meta.fields (или атрибут Meta.exclude ). Однако ModelAdmin проигнорируйте это значение, переопределив его с помощью атрибута ModelAdmin.list_editable . Самое простое решение — опустить атрибут Meta.model , поскольку ModelAdmin это обеспечит правильную модель для использования.

        ModelAdmin. get_changelist_formset ( просьба , ** kwargs ) ¶

        Возвращает класс ModelFormSet, используемый на странице списка для модификации, когда list_editable он используется. Чтобы использовать настраиваемый набор форм, например:

        from django.forms import BaseModelFormSet class MyAdminFormSet(BaseModelFormSet): pass class MyModelAdmin(admin.ModelAdmin): def get_changelist_formset(self, request, **kwargs): kwargs['formset'] = MyAdminFormSet return super().get_changelist_formset(request, **kwargs) 

        ModelAdmin. lookup_allowed ( поиск , значение ) ¶

        Объекты на странице списка для модификации интерфейса администрирования могут быть отфильтрованы по поисковым выражениям из строки запроса GET URL-адреса. Вот как это работает, например list_filter . Поисковые фразы похожи на используемые QuerySet.filter() (например, [email protected] :). Поскольку пользователь может управлять выражениями поиска, их следует очистить, чтобы предотвратить несанкционированное раскрытие данных.

        Метод lookup_allowed() получает путь поиска из строки запроса (например ‘user__email’` ) и соответствующее значение (например ‘[email protected]’ ) и возвращает логическое значение, указывающее, QuerySet разрешена ли фильтрация страницы редактирования с использованием параметров. Если lookup_allowed() возвращается False , создается DisallowedModelAdminLookup (подкласс SuspiciousOperation ).

        По умолчанию lookup_allowed() предоставляет доступ к локальным полям модели, путям используемых полей list_filter (но не к путям get_list_filter() ) и выражениям поиска, необходимым для limit_choices_to правильной работы raw_id_fields .

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

        ModelAdmin. has_view_permission ( запрос , obj = Нет ) ¶

        Должен вернуться, True если отображение obj разрешено, в False противном случае. Если obj равно None , значение True или False возвращаемое значение должно указывать, разрешено ли отображение объектов этого типа в целом (например, возвращение значения False означает, что текущий пользователь не авторизован для отображения объекта этого типа. ).

        Реализация по умолчанию возвращает, есть True ли у пользователя разрешение на редактирование или просмотр.

        ModelAdmin. has_add_permission ( запрос ) ¶

        Должен возвращаться, True если добавление объекта разрешено, в False противном случае.

        ModelAdmin. has_change_permission ( запрос , obj = Нет ) ¶

        Должен вернуться, True если редактирование obj разрешено, в False противном случае. Если это obj равно None , значение True или False возвратить должно указать , является ли модификация объектов данного типа допускается в целом (например , возвращая значение , False означает , что текущий пользователь не имеет право изменить объект данного типа) ,

        ModelAdmin. has_delete_permission ( запрос , obj = Нет ) ¶

        Должен вернуться, True если удаление obj разрешено, в False противном случае. Если это obj равно None значение True или False возвращено необходимо указать , является ли удаление объектов данного типа допускается в целом (например , возвращая значение False означает , что текущий пользователь не имеет право удалять объект этого типа).

        ModelAdmin. has_module_permission ( запрос ) ¶

        Должен возвращаться, True если модуль отображается на домашней странице администратора и доступ к домашней странице модуля разрешен, или в False противном случае. Используется по умолчанию User.has_module_perms() . Переопределив этот метод, вы не ограничиваете доступ к просмотру, добавлению, редактированию или удалению представлений; Для этого используйте has_view_permission() , has_add_permission() , has_change_permission() и has_delete_permission() .

        ModelAdmin. get_queryset ( запрос ) ¶

        Метод get_queryset one ModelAdmin возвращает объект QuerySet всех экземпляров модели, которые могут быть изменены сайтом администрирования. Вариант использования для переопределения этого метода — отображать объекты, принадлежащие вошедшему в систему пользователю:

        class MyModelAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super().get_queryset(request) if request.user.is_superuser: return qs return qs.filter(author=request.user) 

        ModelAdmin. message_user ( запрос , сообщение , уровень = messages.INFO , extra_tags = » , fail_silently = False ) ¶

        Именованные параметры используются для изменения уровня сообщения, добавления дополнительных тегов CSS или автоматического отказа, если движок contrib.messages не установлен. Эти именованные параметры соответствуют параметрам django.contrib.messages.add_message() , см. Документацию по этой функции для более подробной информации. Одно из отличий заключается в том, что уровень может передаваться как строка в дополнение к целому числу или константе.

        ModelAdmin. get_paginator ( Запрос , QuerySet , per_page , сироты = 0 , allow_empty_first_page = True ) ¶

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

        ModelAdmin. response_add ( запрос , объект , post_url_continue = Нет ) ¶

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

        ModelAdmin. response_change ( запрос , объект ) ¶

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

        ModelAdmin. response_delete ( запрос , obj_display , obj_id ) ¶

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

        obj_display — строка, содержащая имя удаленного объекта.

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

        ModelAdmin. get_changeform_initial_data ( запрос ) ¶

        Точка расширения исходных данных для форм изменения в администрации. По умолчанию полям присваиваются начальные значения из параметров GET . Так , например, ?name=initial_value устанавливает начальное значение поля name к initial_value .

        Этот метод должен возвращать словарь формы :

        def get_changeform_initial_data(self, request): return 'name': 'custom_initial_value'> 

        ModelAdmin. get_deleted_objects ( объекты , запрос ) ¶

        Точка входа для настройки процесса удаления из поля зрения delete_view() и « Действие » для удаления выбранных элементов ».

        Параметр objs представляет собой серию однородных объектов (один QuerySet или список экземпляров модели) для удаления и request является запросом HttpRequest .

        Этот метод должен возвращать 4 кортежа . (objets_supprimés, nombre_de_modèles, permissions_nécessaires, protégés)

        objets_supprimés это список строк, представляющих все объекты, которые будут удалены. Если есть связанные объекты для удаления, список является вложенным и содержит эти связанные объекты. Список форматируется в шаблоне с помощью фильтра unordered_list .

        nombre_de_modèles представляет собой словарь соответствия между атрибутом verbose_name_plural каждой модели и количеством объектов, которые необходимо удалить из этой модели.

        permissions_nécessaires представляет собой набор названий verbose_name моделей, которые пользователь не имеет права удалять.

        protégés — это список строк, представляющих все защищенные связанные объекты, которые нельзя удалить. Список отображается в шаблоне.

        Другие методы ¶

        ModelAdmin. add_view ( запрос , form_url = » , extra_context = None ) ¶

        Представление Django для страницы добавления экземпляра модели. См. Примечание ниже.

        ModelAdmin. change_view ( Запрос , object_id , FORM_URL = » , extra_context = нет ) ¶

        Представление Django для страницы редактирования экземпляра модели. См. Примечание ниже.

        ModelAdmin. changelist_view ( запрос , extra_context = None ) ¶

        Представление Django для списка для страниц модификации и действий на экземплярах модели. См. Примечание ниже.

        ModelAdmin. delete_view ( запрос , object_id , extra_context = None ) ¶

        Представление Django для страницы подтверждения удаления экземпляра модели. См. Примечание ниже.

        ModelAdmin. history_view ( запрос , object_id , extra_context = None ) ¶

        Представление Django для страницы, показывающей историю изменений для данного экземпляра модели.

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

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

        class MyModelAdmin(admin.ModelAdmin): # A template for a very customized change view: change_form_template = 'admin/myapp/extras/openstreetmap_change_form.html' def get_osm_info(self): # . pass def change_view(self, request, object_id, form_url='', extra_context=None): extra_context = extra_context or <> extra_context['osm_data'] = self.get_osm_info() return super().change_view( request, object_id, form_url, extra_context=extra_context, ) 

        Эти представления возвращают экземпляры, которые TemplateResponse позволяют легко настроить данные ответа перед процессом рендеринга. Подробнее см. Документацию TemplateResponse .

        ¶ определения сторонних файлов ModelAdmin

        Иногда содержимое CSS или JavaScript может быть полезно для добавления или редактирования представлений. Это можно сделать с помощью Media внутреннего класса ModelAdmin :

        class ArticleAdmin(admin.ModelAdmin): class Media: css =  "all": ("my_styles.css",) > js = ("my_code.js",) 

        Приложение staticfiles ставит перед всеми путями статических файлов префикс STATIC_URL (или, MEDIA_URL если STATIC_URL есть None ). Применяются те же правила, что и для определения дополнительных файлов в формах .

        jQuery ¶

        Код JavaScript администрирования Django использует библиотеку jQuery .

        Чтобы избежать конфликтов с пользовательскими скриптами или библиотеками, jQuery Django (версия 3.5.1) имеет пространство имен как django.jQuery . Если вы хотите использовать jQuery в своем собственном административном JavaScript без включения второй копии, вы можете использовать django.jQuery объект в списке изменений и добавлять / редактировать представления.

        Изменено в Django 3.0:

        Встроенная версия jQuery обновлена ​​с 3.3.1 до 3.4.1.

        Изменено в Django 3.1:

        Встроенная версия jQuery обновлена ​​с 3.4.1 до 3.5.1.

        По ModelAdmin умолчанию для класса требуется jQuery, поэтому нет необходимости добавлять jQuery в список ресурсов media класса, ModelAdmin если это не требуется. Например, если вам нужно поместить библиотеку jQuery в глобальное пространство имен (например, для использования внешних плагинов jQuery) или вам нужна более новая версия jQuery, тогда полезно включите вашу собственную копию этой библиотеки.

        Django предоставляет как несжатые, так и «свернутые» версии jQuery, как jquery.js и jquery.min.js соответственно.

        ModelAdmin И классы InlineModelAdmin имеют свойство , media которое возвращает список объектов , Media которые хранят пути к файлам JavaScript для форм и сгруппированных форм. Если DEBUG установлено True , возвращаются несжатые версии различных файлов JavaScript, в том числе для jquery.js ; в противном случае возвращаются «свернутые» версии.

        Добавление кастомной валидации в администрирование ¶

        Вы также можете добавить персонализированную проверку данных в администрировании. Интерфейс автоматического администрирования используется повторно django.forms , и этот класс ModelAdmin дает вам возможность определять свою собственную форму:

        class ArticleAdmin(admin.ModelAdmin): form = MyArticleAdminForm 

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

        class MyArticleAdminForm(forms.ModelForm): def clean_name(self): # do something that validates your data return self.cleaned_data["name"] 

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

        Объекты InlineModelAdmin ¶

        класс InlineModelAdmin ¶ класс TabularInline ¶ класс StackedInline ¶

        В интерфейсе администрирования есть возможность изменять модели на той же странице, что и родительская модель. Их называют «встроенными» или подчиненными формами. Предположим, у вас есть эти две модели:

        from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) title = models.CharField(max_length=100) 

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

        from django.contrib import admin class BookInline(admin.TabularInline): model = Book class AuthorAdmin(admin.ModelAdmin): inlines = [ BookInline, ] 

        Django предоставляет два подкласса, из InlineModelAdmin которых:

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

        ¶ варианты InlineModelAdmin

        InlineModelAdmin имеет несколько схожих характеристик ModelAdmin и добавляет несколько собственных (общие характеристики фактически определены в родительском классе BaseModelAdmin ). Общие характеристики:

        • form
        • fieldsets
        • fields
        • formfield_overrides
        • exclude
        • filter_horizontal
        • filter_vertical
        • ordering
        • prepopulated_fields
        • get_fieldsets()
        • get_queryset()
        • radio_fields
        • readonly_fields
        • raw_id_fields
        • formfield_for_choice_field()
        • formfield_for_foreignkey()
        • formfield_for_manytomany()
        • has_module_permission()

        Класс InlineModelAdmin добавляет или настраивает:

        Шаблон, используемый подчиненной формой. Обязательный атрибут.

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

        По умолчанию это BaseInlineFormSet . Использование вашего собственного класса сгруппированной формы может дать вам множество возможностей настройки. Подчиненные формы построены на основе сгруппированных модельных форм .

        По умолчанию form это ModelForm . Это то, что передается функции inlineformset_factory() при создании подчиненных форм.

        При написании настраиваемой проверки для форм InlineModelAdmin будьте осторожны при написании кода проверки, основанного на функциональности родительской модели. Если последнее не удается во время проверки, его содержимое может находиться в несогласованном состоянии, как описано в предупреждении Validate ModelForm .

        InlineModelAdmin. classes ¶

        Список или кортеж, содержащий дополнительные классы CSS для применения к сгенерированным подчиненным формам. По умолчанию это None . Как и в случае с настроенными классами fieldsets , подчиненные формы с классом collapse изначально свернуты, а их заголовок содержит небольшую ссылку «Показать».

        Это контролирует количество дополнительных форм, которые сгруппированная форма будет отображать в дополнение к исходным формам. Значение по умолчанию — 3. Дополнительную информацию см. В документации по сгруппированным формам .

        Для пользователей браузеров с включенным JavaScript предоставляется ссылка «Добавить еще», позволяющая добавить ряд дополнительных подчиненных форм в дополнение к тем, которые предоставляются в зависимости от настройки extra .

        Динамическая ссылка не отображается, если количество отображаемых в настоящее время форм превышает max_num или если JavaScript не включен на стороне пользователя.

        InlineModelAdmin.get_extra() также позволяет настроить количество дополнительных форм.

        Это контролирует максимальное количество форм для отображения в подчиненных формах. Это не соответствует напрямую количеству объектов, но может быть, если значение достаточно мало. См. Раздел « Ограничение количества редактируемых объектов» для получения дополнительной информации.

        InlineModelAdmin.get_max_num() также позволяет настроить максимальное количество дополнительных форм.

        Это контролирует минимальное количество форм для отображения в подчиненных формах. См. modelformset_factory() Дополнительную информацию.

        InlineModelAdmin.get_min_num() также позволяет настроить минимальное количество отображаемых форм.

        По умолчанию интерфейс администратора Django использует для полей интерфейс выбора () ForeignKey . Иногда вы не хотите медлить с выбором всех связанных экземпляров для отображения из раскрывающегося списка.

        raw_id_fields это список полей, которые вы хотите изменить с помощью простого компонента Input , будь то поле ForeignKey или ManyToManyField :

        class BookInline(admin.TabularInline): model = Book raw_id_fields = ("pages",) 

        InlineModelAdmin. template ¶

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

        Переопределение имени verbose_name во Meta внутреннем классе модели.

        Переопределение имени verbose_name_plural во Meta внутреннем классе модели.

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

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

        InlineModelAdmin. get_formset ( запрос , obj = None , ** kwargs ) ¶

        Верните класс, который BaseInlineFormSet будет использоваться в представлениях администратора для добавления и редактирования. obj редактируется родительский объект или None добавляется новый родительский объект . См. Пример ModelAdmin.get_formsets_with_inlines .

        InlineModelAdmin. get_extra ( запрос , obj = None , ** kwargs ) ¶

        Возвращает количество добавляемых дополнительных подчиненных форм. По умолчанию возвращает атрибут InlineModelAdmin.extra .

        Переопределите этот метод, чтобы динамически определять количество дополнительных подчиненных форм. Например, это может зависеть от экземпляра модели (переданного как именованный параметр obj ):

        class BinaryTreeAdmin(admin.TabularInline): model = BinaryTree def get_extra(self, request, obj=None, **kwargs): extra = 2 if obj: return extra - obj.binarytree_set.count() return extra 

        InlineModelAdmin. get_max_num ( запрос , obj = None , ** kwargs ) ¶

        Возвращает максимальное количество добавляемых дополнительных подчиненных форм. По умолчанию возвращает атрибут InlineModelAdmin.max_num .

        Переопределите этот метод, чтобы динамически определять максимальное количество подчиненных форм. Например, это может зависеть от экземпляра модели (переданного как именованный параметр obj ):

        class BinaryTreeAdmin(admin.TabularInline): model = BinaryTree def get_max_num(self, request, obj=None, **kwargs): max_num = 10 if obj and obj.parent: return max_num - 5 return max_num 

        InlineModelAdmin. get_min_num ( запрос , obj = None , ** kwargs ) ¶

        Возвращает минимальное количество используемых подчиненных форм. По умолчанию возвращает атрибут InlineModelAdmin.min_num .

        Переопределите этот метод, чтобы программно определить минимальное количество подчиненных форм. Например, это может быть основано на экземпляре модели (переданном как именованный параметр obj ):

        InlineModelAdmin. has_add_permission ( запрос , объект ) ¶

        Должен вернуться, True если добавление подобъекта разрешено, в False противном случае. obj редактируется родительский объект или None добавляется новый родительский объект .

        InlineModelAdmin. has_change_permission ( запрос , obj = Нет ) ¶

        Должен возвращаться, True если редактирование подобъекта разрешено, в False противном случае. obj редактируется родительский объект.

        InlineModelAdmin. has_delete_permission ( запрос , obj = Нет ) ¶

        Должен возвращаться, True если удаление подобъекта разрешено, в False противном случае. obj редактируется родительский объект.

        Параметр, obj передаваемый методам, InlineModelAdmin является редактируемым родительским объектом или None при добавлении нового родительского объекта .

        Модель с двумя или более внешними ключами к одной родительской модели ¶

        Иногда возможно иметь более одного внешнего ключа для одной и той же модели. Возьмем, к примеру, эту модель:

        from django.db import models class Friendship(models.Model): to_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="friends") from_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="from_friends") 

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

        from django.contrib import admin from myapp.models import Friendship class FriendshipInline(admin.TabularInline): model = Friendship fk_name = "to_person" class PersonAdmin(admin.ModelAdmin): inlines = [ FriendshipInline, ] 

        Модели с отношениями «многие ко многим» ¶

        По умолчанию компоненты администрирования для отношений «многие ко многим» отображаются на уровне шаблона, который устанавливает ссылку ManyToManyField . В зависимости от определения ModelAdmin каждое поле «многие ко многим» в шаблоне представлено стандартным HTML, горизонтальным или вертикальным фильтром или компонентом . Однако также можно заменить эти компоненты подчиненными формами. raw_id_admin

        Допустим, у нас есть следующие модели:

        from django.db import models class Person(models.Model): name = models.CharField(max_length=128) class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField(Person, related_name='groups') 

        Если вы хотите отобразить отношения «многие ко многим» с помощью подчиненной формы, вы можете сделать это, определив объект InlineModelAdmin для отношения:

        from django.contrib import admin class MembershipInline(admin.TabularInline): model = Group.members.through class PersonAdmin(admin.ModelAdmin): inlines = [ MembershipInline, ] class GroupAdmin(admin.ModelAdmin): inlines = [ MembershipInline, ] exclude = ('members',) 

        В этом примере есть две интересные характеристики.

        Во-первых, MembershipInline эталонный класс Group.members.through . Атрибут through является ссылкой на модель, которая управляет отношением «многие ко многим». Этот шаблон автоматически создается Django, когда вы определяете поле «многие ко многим».

        Во-вторых, GroupAdmin необходимо вручную исключить поле members . Django отображает компонент администратора для поля модели «многие ко многим», которое определяет отношение (в данном случае Group ). Если вы хотите использовать модель подчиненной для представления множественного отношения, вы должны сказать Django администратора не для отображения этого компонента — в противном случае вы будете в конечном итоге с двумя компонентами на странице администратора для обработки отношения. ,

        Обратите внимание, что при использовании этой техники сигналы m2m_changed не запускаются. Причина в том, что для сайта администрирования through он рассматривается только как шаблон с двумя внешними ключами, а не как отношение «многие ко многим».

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

        Промежуточные модели отношений «многие ко многим» ¶

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

        Тем не менее, вполне законно иметь возможность редактировать эту информацию в Интернете. К счастью, это можно сделать с помощью подчиненных форм администрирования. Предположим, у нас есть следующие модели:

        from django.db import models class Person(models.Model): name = models.CharField(max_length=128) class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField(Person, through='Membership') class Membership(models.Model): person = models.ForeignKey(Person, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) date_joined = models.DateField() invite_reason = models.CharField(max_length=64) 

        Первым шагом для отображения промежуточной модели в администрировании является определение класса подчиненной формы для модели Membership :

        class MembershipInline(admin.TabularInline): model = Membership extra = 1 

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

        Теперь давайте создадим административные представления для моделей Person и Group :

        class PersonAdmin(admin.ModelAdmin): inlines = (MembershipInline,) class GroupAdmin(admin.ModelAdmin): inlines = (MembershipInline,) 

        Наконец, зарегистрируйте свои модели Person и Group на сайте администрирования:

        admin.site.register(Person, PersonAdmin) admin.site.register(Group, GroupAdmin) 

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

        Использование общих отношений в качестве подчиненных ¶

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

        from django.contrib.contenttypes.fields import GenericForeignKey from django.db import models class Image(models.Model): image = models.ImageField(upload_to="images") content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey("content_type", "object_id") class Product(models.Model): name = models.CharField(max_length=100) 

        Если вы хотите разрешить редактирование и создание экземпляра Image из представлений добавления / редактирования Product , вы можете использовать GenericTabularInline или GenericStackedInline (оба подкласса GenericInlineModelAdmin ), предоставленные admin . Они реализуют визуальный макет в табличной или составной форме, соответственно, для форм, представляющих связанные объекты, как и их неуниверсальные аналоги. Они ведут себя как любая другая подчиненная форма. В вашем файле admin.py для этого примера приложения:

        from django.contrib import admin from django.contrib.contenttypes.admin import GenericTabularInline from myproject.myapp.models import Image, Product class ImageInline(GenericTabularInline): model = Image class ProductAdmin(admin.ModelAdmin): inlines = [ ImageInline, ] admin.site.register(Product, ProductAdmin) 

        См. Документацию по типам содержимого для получения более подробной информации.

        Новое определение шаблонов администрирования ¶

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

        Настройка каталогов шаблонов администрирования для проекта ¶

        Файлы административных шаблонов находятся в каталоге contrib/admin/templates/admin .

        Чтобы переопределить любой из них, сначала создайте каталог admin в каталоге templates вашего проекта. Это может быть любой каталог , упомянутый в DIRS моторном опции из DjangoTemplates в TEMPLATES настройке. Если параметр ‘loaders’ был настроен, проверьте, что ‘django.template.loaders.filesystem.Loader’ отображается раньше, ‘django.template.loaders.app_directories.Loader’ чтобы настроенные шаблоны были найдены системой загрузки шаблонов раньше тех, которые включены в django.contrib.admin .

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

        Чтобы переопределить административный шаблон для конкретного приложения, скопируйте и отредактируйте шаблон из каталога django/contrib/admin/templates/admin и сохраните его в одном из только что созданных каталогов.

        Например, если мы хотим добавить в список инструмент для изменения всех моделей именованного приложения my_app , нам нужно будет скопировать contrib/admin/templates/admin/change_list.html его в каталог templates/admin/my_app/ проекта и внести необходимые изменения.

        Если бы мы хотели добавить в список инструмент для изменения определенной модели Page , нам пришлось бы скопировать этот же файл в каталог templates/admin/my_app/page проекта.

        Переопределение или замена шаблона администрирования ¶

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

        Продолжая приведенный выше пример, мы хотим добавить новую ссылку рядом с инструментом Historique для шаблона Page . После изучения change_form.html выясняется, что object-tools-items нужно переопределить только блок . Вот новая версия change_form.html :

         extends "admin/change_form.html" %>  load i18n admin_urls %>  block object-tools-items %> li> a href=" url opts|admin_urlname:'history' original.pk|admin_urlquote %>" class="historylink"> translate "History" %>a> li> li> a href="mylink/" class="historylink">My Linka> li>  if has_absolute_url %> li> a href=" url 'admin:view_on_site' content_type_id original.pk %>" class="viewsitelink"> translate "View on site" %>a> li>  endif %>  endblock %> 

        И это все ! Если мы поместим этот файл в каталог templates/admin/my_app , новая ссылка появится в форме редактирования для всех моделей в my_app.

        Шаблоны, которые могут быть переопределены приложением или моделью ¶

        Не все шаблоны contrib/admin/templates/admin можно переопределить в зависимости от приложения или модели. Следующее может:

        • 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

        Среди шаблонов, которые нельзя переопределить таким образом, всегда можно переопределить их для всего проекта, поместив новую версию в каталог templates/admin . Это особенно полезно для создания собственных страниц 404 и 500.

        Некоторые шаблоны администратора, например change_list_results.html , используются для создания настраиваемых тегов включения. Их можно переопределить, но в этом случае вам, вероятно, лучше создать свою собственную версию рассматриваемого тега и дать ему другое имя. Таким образом, вы можете использовать его выборочно.

        Шаблоны рута и подключения ¶

        Если вы хотите изменить шаблоны домашней страницы, страницы входа или выхода из системы, вам лучше создать свой собственный экземпляр AdminSite (см. Ниже) и отредактировать свойства AdminSite.index_template , AdminSite.login_template или AdminSite.logout_template .

        Объекты AdminSite ¶

        класс AdminSite ( имя = ‘админ’ ) ¶

        Сайт администрирования Django представлен экземпляром django.contrib.admin.sites.AdminSite ; По умолчанию экземпляр этого класса создается как, django.contrib.admin.site и вы можете зарегистрировать свои модели и экземпляры в ModelAdmin этом экземпляре.

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

        При создании экземпляра AdminSite вы можете указать уникальное имя экземпляра с помощью параметра name конструктора. Это имя экземпляра используется для идентификации экземпляра, особенно при обратном разрешении административных URL-адресов . Если имя экземпляра не указано, admin будет использоваться имя экземпляра по умолчанию. См. Раздел Настройка класса AdminSite для примера настройки класса AdminSite .

        Атрибуты AdminSite ¶

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

        Текст, который нужно вставить вверху каждой страницы сайта администрирования в тег (строку). По умолчанию это «Администрирование Django».

        Текст для вставки после тега каждой страницы сайта администрирования (строка). По умолчанию это «сайт администрирования Django».

        URL-адрес ссылки «Просмотреть сайт» в верхней части каждой страницы администрирования. По умолчанию site_url содержит / . Укажите значение None для удаления ссылки.

        Для сайтов, работающих по подпутью, метод each_context() проверяет, имеет ли текущий запрос значение, request.META[‘SCRIPT_NAME’] и использует его, если . site_url«n’est pas défini à autre chose que «/

        Текст для вставки вверху главной страницы сайта администрирования (строка). По умолчанию это «Администрирование сайта».

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

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

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

        Новое в Django 3.1.

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

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

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

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

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

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

        Методы AdminSite ¶

        AdminSite. each_context ( запрос ) ¶

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

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

        • site_header : AdminSite.site_header
        • site_title : AdminSite.site_title
        • site_url : AdminSite.site_url
        • has_permission : AdminSite.has_permission()
        • available_apps : список приложений из реестра приложений, доступных текущему пользователю. Каждый элемент в списке представляет собой словарь, представляющий приложение со следующими ключами:
          • app_label : этикетка приложения
          • app_url : URL домашней страницы приложения на сайте администрирования
          • has_module_perms : логическое значение, указывающее, разрешен ли просмотр и доступ к домашней странице модуля для текущего пользователя
          • models : список моделей, доступных в приложении

          Каждая модель представляет собой словарь со следующими ключами:

          • object_name : имя класса модели
          • name : имя модели во множественном числе
          • perms Один с dict указанием разрешений add , change , delete и view
          • admin_url : URL списка для модификации модели на сайте администрирования
          • add_url : URL для добавления нового экземпляра модели на сайт администрирования

          Возвращает, есть True ли у пользователя HttpRequest данного запроса разрешение на просмотр хотя бы одной страницы сайта администрирования. По умолчанию это необходимо User.is_active и того и User.is_staff другого True .

          AdminSite. register ( model_or_iterable , admin_class = None , ** варианты ) ¶

          Регистрирует данный класс модели (или список классов) с admin_class указанным классом . По умолчанию admin_class — ModelAdmin (параметры администрирования по умолчанию). Если указаны именованные параметры (например list_display ), они будут применяться как опции класса администрирования.

          Генерируется, ImproperlyConfigured если модель является абстрактной и django.contrib.admin.sites.AlreadyRegistered если модель уже зарегистрирована.

          Подключение экземпляров AdminSite в конфигурации URL ¶

          Последним шагом в настройке администрирования Django является включение вашего экземпляра AdminSite в конфигурацию URL. Для этого укажите указанный URL-адрес на метод AdminSite.urls . Использовать не обязательно include() .

          В этом примере мы сопоставляем экземпляр по AdminSite умолчанию django.contrib.admin.site с URL-адресом /admin/ :

          # urls.py from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), ] 

          Настройка класса AdminSite ¶

          Если вы хотите создать свой собственный сайт администрирования с настраиваемым поведением, вы можете создать подкласс AdminSite и переопределить или добавить к нему все, что захотите. Затем создайте экземпляр своего подкласса AdminSite (по тому же принципу, что и любой другой класс Python) и зарегистрируйте там свои модели и подклассы ModelAdmin вместо того, чтобы делать это на сайте по умолчанию. Наконец, обновите, monprojet/urls.py чтобы ссылаться на ваш подкласс AdminSite .

          myapp / admin.py ¶

          from django.contrib.admin import AdminSite from .models import MyModel class MyAdminSite(AdminSite): site_header = 'Monty Python administration' admin_site = MyAdminSite(name='myadmin') admin_site.register(MyModel) 

          myproject / urls.py ¶

          from django.urls import path from myapp.admin import admin_site urlpatterns = [ path('myadmin/', admin_site.urls), ] 

          Обратите внимание, что автоматическое обнаружение модулей admin не обязательно желательно при использовании вашего собственного экземпляра, AdminSite поскольку вы, вероятно, импортируете все модули admin из каждого приложения в основной модуль projet.admin . Это означает , что необходимо заменить ‘django.contrib.admin’ с ‘django.contrib.admin.apps.SimpleAdminConfig’ в настройках INSTALLED_APPS .

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

          Вы можете переопределить сайт django.contrib.admin.site по умолчанию, установив для атрибута настраиваемого default_site класса AppConfig путь импорта, указывающий на подкласс AdminSite или на исполняемый объект, который возвращает экземпляр сайта.

          myproject / admin.py ¶

          from django.contrib import admin class MyAdminSite(admin.AdminSite): . 

          myproject / apps.py ¶

          from django.contrib.admin.apps import AdminConfig class MyAdminConfig(AdminConfig): default_site = 'myproject.admin.MyAdminSite' 

          myproject / settings.py ¶

          INSTALLED_APPS = [ . 'myproject.apps.MyAdminConfig', # replaces 'django.contrib.admin' . ] 

          Несколько сайтов администрирования в одной конфигурации URL ¶

          На одном сайте Django можно создать несколько экземпляров сайта администрирования. Создайте несколько экземпляров AdminSite и укажите для каждого свой URL.

          В этом примере URL-адреса /basic-admin/ и /advanced-admin/ соответствуют отдельным версиям сайта администрирования с использованием экземпляров AdminSite myproject.admin.basic_site и myproject.admin.advanced_site , соответственно:

          # urls.py from django.urls import path from myproject.admin import advanced_site, basic_site urlpatterns = [ path('basic-admin/', basic_site.urls), path('advanced-admin/', advanced_site.urls), ] 

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

          Добавление представлений на сайты администрирования ¶

          Так же , как ModelAdmin , AdminSite обеспечивает способ , get_urls() который может быть преодолен , чтобы определить дополнительные виды для сайта. Чтобы добавить новое представление на сайт администрирования, расширьте базовый метод, get_urls() включив в него причину появления нового представления.

          Любое представление, которое вы визуализируете, которое использует административные шаблоны или расширяет базовый административный шаблон, должно быть определено request.current_app до визуализации шаблона. Эта переменная должна содержать, self.name если представление находится в AdminSite или self.admin_site.name если представление находится в ModelAdmin .

          Добавлена ​​функция сброса пароля ¶

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

          from django.contrib.auth import views as auth_views path( 'admin/password_reset/', auth_views.PasswordResetView.as_view(), name='admin_password_reset', ), path( 'admin/password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done', ), path( 'reset///', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm', ), path( 'reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete', ), 

          (Предполагается, что вы разместили админ-сайт, admin/ и вам необходимо указать URL-адреса, начинающиеся с ^admin/ перед строкой, которая включает само админское приложение).

          Присутствие указанного URL-адреса admin_password_reset приведет к появлению ссылки «Забыли пароль?». ”На странице входа администратора по умолчанию под полем для ввода пароля.

          Объекты LogEntry (логирование) ¶

          класс models. LogEntry ¶

          Класс LogEntry отслеживает добавления, изменения и удаления объектов, сделанные через интерфейс администрирования.

          Атрибуты LogEntry ¶

          LogEntry. action_time ¶

          Дата и время действия.

          Пользователь (экземпляр AUTH_USER_MODEL ), выполнивший действие.

          Тип содержимого ( ContentType ) измененного объекта.

          Текстовое представление первичного ключа измененного объекта.

          Представление repr() объекта после его модификации.

          Тип действия вошли: ADDITION , CHANGE , DELETION .

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

          from django.contrib.admin.models import ADDITION, LogEntry LogEntry.objects.filter(action_flag=ADDITION) 

          LogEntry. change_message ¶

          Подробное описание модификации. Например, в случае редактирования сообщение содержит список измененных полей. Сайт администрирования Django форматирует это содержимое как структуру JSON, чтобы get_change_message() переведенное сообщение можно было перекомпоновать на текущем языке пользователя. Однако пользовательский код может вводить одну строку. Рекомендуется использовать метод get_change_message() для чтения этого значения вместо прямого доступа к нему.

          Методы LogEntry ¶

          LogEntry. get_edited_object () ¶

          Ярлык, возвращающий указанный объект.

          Форматирует и переводит change_message на текущий язык пользователя. Сообщения, созданные до Django 1.10, по-прежнему будут отображаться на текущем языке при регистрации.

          Обратное разрешение админских URL ¶

          Когда один из AdminSite них развернут, представления, предоставляемые этим сайтом, могут быть доступны с помощью системы обратного разрешения URL-адресов Django.

          AdminSite предоставляет следующие именованные шаблоны URL:

          страница Имя URL настройки
          Домой index
          Авторизоваться login
          Выйти logout
          Смена пароля password_change
          Смена пароля завершена password_change_done
          JavaScript i18n jsi18n
          Домашняя страница приложения app_list app_label
          Перенаправление на страницу объекта view_on_site content_type_id , object_id

          Каждый экземпляр ModelAdmin предоставляет дополнительный набор именованных URL:

          страница Имя URL настройки
          Список для редактирования >_>_changelist
          Добавление >_>_add
          исторический >_>_history object_id
          делеция >_>_delete object_id
          модификация >_>_change object_id

          Класс UserAdmin предоставляет именованный URL:

          страница Имя URL настройки
          Смена пароля auth_user_password_change user_id

          Эти именованные URL-адреса регистрируются в пространстве имен приложения admin , а пространство имен экземпляра соответствует имени экземпляра сайта.

          Поэтому, если вы хотите получить ссылку на представление редактирования для Choice определенного объекта (из приложения опроса) в администраторе по умолчанию, вам нужно будет написать:

          >>> from django.urls import reverse >>> c = Choice.objects.get(. ) >>> change_url = reverse('admin:polls_choice_change', args=(c.id,)) 

          Первый зарегистрированный экземпляр административного приложения (независимо от имени экземпляра) будет идентифицирован и использован для разрешения просмотра редактируемого экземпляра poll.Choice для этого экземпляра.

          Если вы ищете URL-адрес в конкретном экземпляре администратора, укажите имя этого экземпляра в качестве подсказки current_app при вызове reverse . Например, если вы специально хотите получить административное представление именованного административного экземпляра custom , вы должны написать:

          >>> change_url = reverse('admin:polls_choice_change', args=(c.id,), current_app='custom') 

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

           load admin_urls %> a href=" url opts|admin_urlname:'add' %>">Add usera> a href=" url opts|admin_urlname:'delete' user.pk %>">Delete this usera> 

          Действие в приведенных выше примерах — это последняя часть имен URL для ModelAdmin описанных выше экземпляров . Переменная opts может быть любым объектом, имеющим атрибуты app_label и model_name обычно предоставляется административными представлениями текущей модели.

          Декоратор staff_member_required ¶

          staff_member_required ( redirect_field_name = ‘next’ , login_url = ‘admin: login’ ) ¶

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

          • Если пользователь вошел в систему, является членом author ( User.is_staff=True ) и active ( User.is_active=True ), представление будет работать нормально.
          • В противном случае запрос перенаправляется на URL-адрес, указанный параметром login_url , с путем, первоначально запрошенным в переменной строки запроса, названной согласно redirect_field_name . Например: /admin/login/?next=/admin/polls/question/3/ .
          from django.contrib.admin.views.decorators import staff_member_required @staff_member_required def my_view(request): . 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *