Главная страница
Навигация по странице:

  • Рис. 18.2.

  • Книга Изучаем Python


    Скачать 4.68 Mb.
    НазваниеКнига Изучаем Python
    Дата10.12.2022
    Размер4.68 Mb.
    Формат файлаpdf
    Имя файлаErik_Metiz_Izuchaem_Python_Programmirovanie_igr_vizualizatsia_da.pdf
    ТипКнига
    #837531
    страница43 из 53
    1   ...   39   40   41   42   43   44   45   46   ...   53
    387
    вся эта информация вам сейчас не понадобится, но она будет в высшей степени полезной, когда вы начнете разрабатывать собственные приложения .
    Необходимо сообщить Django, какой атрибут должен использоваться по умолча- нию при вводе информации о теме. Django вызывает метод
    __str__()
    для вывода простого представления модели. Мы написали реализацию
    __str__()
    , которая возвращает строку, хранящуюся в атрибуте text
    .
    ПРИМЕЧАНИЕ
    Если вы используете Python 2 .7, метод __str__() должен называться __unicode__() . Тело метода остается неизменным .
    Активизация моделей
    Чтобы использовать модели, необходимо приказать Django включить приложение в общий проект. Откройте файл settings .py
    (из каталога learning_log/learning_log
    ) и найдите в нем раздел, который сообщает Django, какие приложения установлены в проекте:
    settings.py
    INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    )
    Это обычный кортеж, который сообщает Django, какие приложения образуют про- ект. Добавьте наше приложение в этот кортеж; измените содержимое
    INSTALLED_
    APPS
    , чтобы оно выглядело так:
    INSTALLED_APPS = (
    'django.contrib.staticfiles',
    # Мои приложения 'learning_logs',
    )
    Группировка приложений в проекте упрощает управление ими по мере того, как проект растет, а количество приложений увеличивается. Здесь мы создаем раздел, который пока содержит только приложение learning_logs
    Затем необходимо приказать Django изменить базу данных для хранения инфор- мации, относящейся к модели
    Topic
    . В терминальном окне введите следующую команду:

    388 Глава 18 • Знакомство с Django
    (ll_env)learning_log$ python manage.py makemigrations learning_logs
    Migrations for 'learning_logs':
    0001_initial.py:
    - Create model Topic
    (ll_env)learning_log$
    По команде makemigrations
    Django определяет, как изменить базу данных для хранения информации, связанной с новыми моделями. Из результатов видно, что
    Django создает файл миграции с именем
    0001_initial .py
    . Эта миграция создает в базе данных таблицу для модели
    Topic
    Теперь применим миграцию для автоматического изменения базы данных:
    (ll_env)learning_log$ python manage.py migrate
    Running migrations:
    Rendering model states... DONE

    Applying learning_logs.0001_initial...
    OK
    Бульшая часть вывода этой команды совпадает с выводом, полученным при первом выполнении команды migrate
    . Обратить внимание следует на строку ; здесь
    Django подтверждает, что применение миграции для learning_logs прошло успеш- но.
    Каждый раз, когда вы захотите изменить данные, которыми управляет Learning
    Log, выполните эти три действия: внесите изменения в models .py
    , вызовите makemigrations для learning_logs и прикажите Django выполнить миграцию про- екта (
    migrate
    ).
    Административный сайт Django
    Django позволяет легко работать с моделями, определенными для приложения, через административный сайт. Этот сайт используется администраторами сайта, а не рядовыми пользователями. В этом разделе мы создадим административный сайт и используем его для добавления некоторых тем через модель
    Topic
    Создание суперпользователя
    Django позволяет создать пользователя, обладающего полным набором привилегий на сайте; такой пользователь называется суперпользователем. Привилегии управля- ют действиями, которые разрешено выполнять пользователю. На самом жестком уровне привилегий пользователь может только читать общедоступную информа- цию на сайте. Зарегистрированным пользователям обычно предоставляется при- вилегия чтения своих приватных данных, а также избранной информации, доступ- ной только для участников сообщества. Для эффективного администрирования веб-приложения владельцу сайта обычно должна быть доступна вся информация, хранящаяся на сайте. Хороший администратор внимательно относится к конфи- денциальной информации пользователя, потому что пользователи доверяют тем приложениям, с которыми они работают.
    Чтобы создать суперпользователя в Django, введите следующую команду и от- ветьте на запросы:

    Начало работы над приложением 389
    (ll_env)learning_log$ python manage.py createsuperuser

    Username (leave blank to use 'ehmatthes'): ll_admin

    Email address:

    Password:
    Password (again):
    Superuser created successfully.
    (ll_env)learning_log$
    При получении команды createsuperuser
    Django предлагает ввести имя пользо- вателя, который является суперпользователем . Здесь мы вводим имя ll_admin
    , но вы можете ввести любое имя на свое усмотрение. Также можно ввести адрес электронной почты или оставить это поле пустым . После этого следует дважды ввести пароль .
    ПРИМЕЧАНИЕ
    Часть конфиденциальной информации может быть скрыта от администраторов сайта . Например,
    Django на самом деле не сохраняет введенный пароль; вместо этого сохраняется хеш — специ- альная строка, построенная на основе пароля . И когда в будущем вы вводите пароль, Django снова хеширует введенные данные и сравнивает результат с хранимым хешем . Если два хеша совпадают, то проверка пройдена . Если же хакер в результате атаки получит доступ к базе данных сайта, он сможет прочитать только хранящийся в базе хеш, но не пароли . При правильной настройке сайта восстановить исходные пароли из хешей почти невозможно .
    Регистрация модели на административном сайте
    Django добавляет некоторые модели (например,
    User и Group) на административ- ный сайт автоматически, но модели, которые мы создали, придется регистрировать вручную.
    При запуске приложения learning_logs
    Django создает файл admin .py в одном каталоге с models .py
    :
    admin.py
    from django.contrib import admin
    # Зарегистрируйте здесь ваши модели.
    Чтобы зарегистрировать
    Topic на административном сайте, введите следующую команду:
    from django.contrib import admin
     from learning_logs.models import Topic
     admin.site.register(Topic)
    Этот код импортирует модель
    Topic
    , после чего использует вызов admin.site.
    register()
    , регистрирующий модель для управления через административный сайт.
    Теперь используйте учетную запись суперпользователя для входа на администра- тивный сайт. Введите адрес http://localhost:8000/admin/, введите имя пользователя и пароль для только что созданного суперпользователя, и вы увидите экран напо- добие изображенного на рис. 18.2. На этой странице можно добавлять новых поль-

    390 Глава 18 • Знакомство с Django зователей и группы, а также вносить изменения в уже существующие настройки.
    Помимо этого можно работать с данными, связанными с только что определенной моделью
    Topic
    Рис. 18.2. Административный сайт с включением модели Topic
    ПРИМЕЧАНИЕ
    Если в браузере появляется сообщение о недоступности веб-страницы, убедитесь в том, что сервер
    Django работает в терминальном окне . Если сервер не работает, активизируйте виртуальную среду и снова введите команду python manage .py runserver .
    Добавление тем
    Когда модель
    Topic зарегистрирована на административном сайте, добавим первую тему. Щелкните на ссылке
    Topics
    , чтобы перейти к странице
    Topics
    ; стра- ница практически пуста, потому что еще нет ни одной темы для выполнения операций. Щелкните на ссылке
    Add
    ; открывается форма для добавления новой темы. Введите в первом поле текст
    Chess и щелкните на ссылке
    Save
    . Вы воз- вращаетесь к административной странице
    Topics
    , на которой появляется только что созданная тема.
    Создадим вторую тему, чтобы у вас было больше данных для работы. Снова щелк- ните на ссылке
    Add и создайте вторую тему
    Rock
    Climbing
    . Ссылка
    Save снова воз- вращает вас к основной странице
    Topics
    , где отображаются обе темы,
    Chess и
    Rock
    Climbing
    Определение модели Entry
    Чтобы сохранить информацию о том, что вы узнали по этим двум темам, необхо- димо определить модель для записей, которые пользователь делает в своих журна- лах. Каждая запись должна ассоциироваться с конкретной темой. Такое отношение называется отношением «многие-к-одному», поскольку многие записи могут быть связаны с одной темой.

    Начало работы над приложением 391
    Код модели
    Entry выглядит так:
    models.py
    from django.db import models class Topic(models.Model):
     class Entry(models.Model):
    """Информация, изученная пользователем по теме"""
     topic = models.ForeignKey(Topic)
     text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)
     class Meta:
    verbose_name_plural = 'entries'
    def __str__(self):
    """Возвращает строковое представление модели."""
     return self.text[:50] + "..."
    Класс
    Entry наследует от базового класса
    Model
    , как и рассмотренный ранее класс
    Topic
    . Первый атрибут, topic
    , является экземпляром
    ForeignKey
    . Термин
    «внешний ключ» (foreign key) происходит из теории баз данных; внешний ключ со- держит ссылку на другую запись в базе данных. Таким образом каждая запись свя- зывается с конкретной темой. Каждой теме при создании присваивается ключ, или идентификатор. Если потребуется установить связь между двумя записями данных,
    Django использует ключ, связанный с каждым блоком информации. Вскоре мы используем такие связи для получения всех записей, связанных с заданной темой.
    Затем идет атрибут с именем text
    , который является экземпляром
    TextField
    .
    Полю такого типа ограничение размера не требуется, потому что размер отдельных записей не ограничивается. Атрибут date_added позволяет отображать записи в по- рядке их создания и снабдить каждую запись временной меткой.
    В точке  класс
    Meta вкладывается в класс
    Entry
    . Класс
    Meta хранит дополнитель- ную информацию по управлению моделью; в данном случае он позволяет задать специальный атрибут, который приказывает Django использовать форму мно- жественного числа
    Entries при обращении более чем к одной записи. (Без этого
    Django будет использовать неправильную форму
    Entrys
    .) Наконец, метод
    __str__()
    сообщает Django, какая информация должна отображаться при обращении к от- дельным записям. Так как запись может быть достаточно длинным блоком текста, мы приказываем Django выводить только первые 50 символов . Также добавля- ется многоточие — признак вывода неполного текста.
    Миграция модели Entry
    Так как мы добавили новую модель, миграцию базы данных необходимо провести снова. Вскоре вы привыкнете к этому процессу: вы изменяете models .py
    , выполняете команду python manage.py makemigrations
    имя_приложения, а затем команду python manage.py migrate

    392 Глава 18 • Знакомство с Django
    Проведите миграцию базы данных и проверьте вывод:
    (ll_env)learning_log$ python manage.py makemigrations learning_logs
    Migrations for 'learning_logs':

    0002_entry.py:
    - Create model Entry
    (ll_env)learning_log$ python manage.py migrate
    Operations to perform:

    Applying learning_logs.0002_entry...
    OK
    Команда генерирует новую миграцию с именем
    0002_entry .py
    , которая сообщает
    Django, как изменить базу данных для хранения информации, связанной с моде- лью Entry . При выдаче команды migrate
    Django подтверждает, что применение миграции прошло успешно .
    Регистрация Entry на административном сайте
    Модель
    Entry тоже необходимо зарегистрировать. Файл admin .py должен выглядеть так:
    admin.py
    from django.contrib import admin from learning_logs.models import Topic, Entry admin.site.register(Topic)
    admin.site.register(Entry)
    Вернитесь на страницу http://localhost/admin/, и вы увидите раздел
    Entries в катего- рии learning_logs
    . Щелкните на ссылке
    Add для
    Entries или щелкните на
    Entries и вы- берите вариант
    Add
    . На экране должен появиться раскрывающийся список для выбора темы, для которой создается запись, и текстовое поле для ввода записи. Выберите в раскрывающемся списке вариант
    Chess и добавьте запись. При выборе ссылки
    Save вы вернетесь к основной административной странице. Здесь проявляются преимуще- ства использования формата text[:50]
    в качестве строкового представления каждой записи; работать с несколькими записями в административном интерфейсе намного удобнее, если вы видите только часть записи вместо ее полного текста.
    Создайте вторую запись для темы
    Chess и одну запись для темы
    Rock
    Climbing
    , чтобы у нас были исходные данные для дальнейшей разработки Learning Log.
    Интерактивная оболочка Django
    Введенные данные можно проанализировать на программном уровне в интерактив- ном терминальном сеансе. Эта интерактивная среда, называемая оболочкой (shell)
    Django, прекрасно подходит для тестирования и диагностики проекта. Пример сеанса в интерактивной оболочке:
    (ll_env)learning_log$ python manage.py shell

    >>> from learning_logs.models import Topic
    >>> Topic.objects.all()
    [, ]

    Начало работы над приложением 393
    Команда python manage.py shell
    (выполняемая в активной виртуальной среде) запускает интерпретатор Python, который может использоваться для работы с ин- формацией в базе данных проекта. В данном случае мы импортируем модель
    Topic из модуля learning_logs.models
    . Затем метод
    Topic.objects.all()
    используется для получения всех экземпляров модели
    Topic
    ; возвращаемый список называется
    итоговым набором (queryset).
    Содержимое итогового набора перебирается точно так же, как и содержимое спи- ска. Например, просмотр идентификаторов, назначенных каждому объекту темы, выполняется так:
    >>> topics = Topic.objects.all()
    >>> for topic in topics:
    ... print(topic.id, topic)
    1 Chess
    2 Rock Climbing
    Итоговый набор сохраняется в topics
    , после чего выводится атрибут id каждого объекта topic и его строковое представление. Мы видим, что теме
    Chess присвоен идентификатор 1, а
    Rock
    Climbing присвоен идентификатор 2.
    Зная идентификатор конкретного объекта, можно получить этот объект и проана- лизировать содержащиеся в нем атрибуты. Просмотрим значения text и date_added для темы
    Chess
    :
    >>> t = Topic.objects.get(id=1)
    >>> t.text
    'Chess'
    >>> t.date_added
    datetime.datetime(2015, 5, 28, 4, 39, 11, 989446, tzinfo=)
    Также можно просмотреть записи, относящиеся к конкретной теме. Ранее мы определили атрибут topic для модели
    Entry
    . Он был экземпляром
    ForeighKey
    , представляющим связь между записью и темой. Django может использовать эту связь для получения всех записей, относящихся к некоторой теме:

    >>> t.entry_set.all()
    [, ]
    Чтобы получить данные через отношение внешнего ключа, используйте имя связанной модели, записанное в нижнем регистре, за которым следует символ подчеркивания и слово set
    . Допустим, у вас имеются модели
    Pizza и
    Topping
    , и модель
    Topping связана с
    Pizza через внешний ключ. Если ваш объект называется my_pizza
    , для получения всех связанных с ним экземпляров
    Topping используется выражение my_pizza.topping_set.all()
    Мы будем использовать такой синтаксис при переходе к программированию стра- ниц, которые могут запрашиваться пользователями. Оболочка очень удобна тогда, когда вы хотите проверить, что ваш код получает нужные данные. Если в оболочке код работает так, как задумано, можно ожидать, что он будет правильно работать

    394 Глава 18 • Знакомство с Django и в файлах, которые вы создаете в своем проекте. Если код выдает ошибки или не загружает те данные, которые должен загружать, вам будет намного проще отладить его в простой оболочке, чем при работе с файлами, генерирующими веб-страницы.
    В книге мы не будем часто возвращаться к оболочке, но вам не стоит забывать о ней — это полезный инструмент, который поможет вам освоить синтаксис Django для работы с данными проекта.
    ПРИМЕЧАНИЕ
    При каждом изменении модели необходимо перезапустить оболочку, чтобы увидеть результаты этих изменений . Чтобы завершить сеанс работы с оболочкой, нажмите Сtrl+D; в Windows нажмите
    Ctrl+Z, а затем Enter .
    УПРАЖНЕНИЯ
    18-2 . Короткие записи: метод __str__() в модели Entry в настоящее время присоединяет многоточие к каждому экземпляру Entry, отображаемому Django на административном сай- те или в оболочке . Добавьте в метод __str__() команду if, добавляющую многоточие только для записей, длина которых превышает 50 символов . Воспользуйтесь административным сайтом, чтобы ввести запись с длиной менее 50 символов, и убедитесь в том, что при ее просмотре многоточие не отображается .
    18-3 . Django API: при написании кода для работы с данными проекта вы создаете за- прос . Просмотрите документацию по созданию запросов к данным по адресу https://docs .
    djangoproject .com/en/1 .8/topics/db/queries/ . Многое из того, что вы увидите, покажется вам новым, но эта информация пригодится вам, когда вы начнете работать над собственными проектами .
    18-4 . Пиццерия: создайте новый проект с именем pizzeria, содержащий приложение pizzas .
    Определите модель Pizza с полем name, в котором хранятся названия видов пиццы (напри- мер, «Гавайская» или «Четыре сыра») . Определите модель Topping с полями pizza и name .
    Поле pizza должно содержать внешний ключ к модели Pizza, а поле name должно позволять хранить такие значения, как «ананас» или «грибы» .
    Зарегистрируйте обе модели на административном сайте . Используйте сайт для ввода на- званий пиццы и дополнений . Изучите введенные данные в интерактивной оболочке .
    Создание страниц: домашняя страница Learning Log
    Обычно процесс создания веб-страниц в Django состоит из трех стадий: опреде- ления URL, написания представлений и написания шаблонов. Сначала следует определить схемы (patterns) URL. Схема URL описывает структуру URL-адреса и сообщает Django, на какие компоненты следует обращать внимание при сопо- ставлении запроса браузера с URL-адресом на сайте, чтобы выбрать возвращаемую страницу.
    Затем каждый URL-адрес связывается с конкретным представлением — функция представления читает и обрабатывает данные, необходимые странице. Функция представления часто вызывает шаблон, который строит страницу, подходящую для передачи браузеру. Чтобы вы лучше поняли, как работает этот механизм, создадим домашнюю страницу для приложения Learning Log. Мы определим URL-адрес домашней страницы, напишем для него функцию представления и создадим про- стой шаблон.

    Начало работы над приложением
    1   ...   39   40   41   42   43   44   45   46   ...   53


    написать администратору сайта