75
Python & Pycharm & Django (Pycharm Professional - для веб-разработки) ТНК 2019 1

Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

  • Upload
    others

  • View
    33

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Python & Pycharm & Django (Pycharm Professional - для веб-разработки)

ТНК

2019

1

Page 2: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Python. Создание классов и объектов

Создание класса в Python начинается с инструкции class. Вот так будет выглядеть минимальный класс.

class C: pass

Класс состоит из: – объявления (инструкция class), – имени класса (нашем случае это имя C) и – тела класса, которое содержит атрибуты и методы (в нашем

минимальном классе есть только одна инструкция pass).

2

Page 3: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

• Для того чтобы создать объект класса необходимо воспользоваться следующим синтаксисом:

имя_объекта = имя_класса() • Класс может содержать атрибуты и методы. Ниже

представлен класс, содержащий атрибуты color(цвет), width (ширина), height (высота).

class Rectangle: color = “green” width = 100 height = 100

3

Page 4: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

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

имя_объекта.атрибут

rect1 = Rectangle()

print(rect1.color)

4

Page 5: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Добавим к нашему классу метод.

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

Например, нашему классу Rectangle, можно добавить метод, считающий площадь прямоугольника. Для того, чтобы метод в классе знал, с каким объектом он работает (это нужно для того, чтобы получить доступ к атрибутам: ширина (width) и высота (height)), первым аргументом ему следует передать параметр self, через который он может получить доступ к своим данным.

class Rectangle:

color = "green"

width = 100

height = 100

def square(self):

return self.width * self.height

5

Page 6: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

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

class Rectangle: color = "green" width = 100 height = 100 def square(self): return self.width*self.height rect1 = Rectangle() print(rect1.color) print(rect1.square()) rect2 = Rectangle() rect2.width = 200 rect2.color = "brown" print(rect2.color) print(rect2.square())

6

Page 7: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Конструктор класса

• Конструктор класса позволяет задать определенные параметры объекта при его создании. Таким образом появляется возможность создавать объекты с уже заранее заданными атрибутами.

• Конструктором класса является метод: __init__(self)

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

7

Page 8: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

class Rectangle: def __init__(self, color="green", width=100, height=100): self.color = color self.width = width self.height = height def square(self): return self.width * self.height rect1 = Rectangle() print(rect1.color) print(rect1.square()) rect1 = Rectangle("yellow", 23, 34) print(rect1.color) print(rect1.square())

8

Page 9: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Наследование

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

• Синтаксически создание класса с указанием его родителя/ей выглядит так: class имя_класса(имя_родителя1, [имя_родителя2,…, имя_родителя_n])

• Доработаем наш пример так, чтобы в нем присутствовало наследование.

9

Page 10: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

class Figure: def __init__(self, color): self.color = color def get_color(self): return self.color class Rectangle(Figure): def __init__(self, color, width=100, height=100): super().__init__(color) self.width = width self.height = height def square(self): return self.width*self.height rect1 = Rectangle("blue") print(rect1.get_color()) print(rect1.square()) rect2 = Rectangle("red", 25, 70) print(rect2.get_color()) print(rect2.square())

10

В конструкторе ключевое слово super() используется как функция, вызывающая родительский конструктор.

Page 11: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Полиморфизм

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

• Проще всего это рассмотреть на примере. • Добавим в базовый класс метод info(), который печатает

сводную информацию по объекту класса Figure и переопределим этот метод в классе Rectangle, где добавим дополнительные данные и вывод.

11

Page 12: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

class Figure: def __init__(self, color): self.color = color def get_color(self): return self.color def info(self): print("Figure") print("Color: " + self.color) class Rectangle(Figure): def __init__(self, color, width=100, height=100): super().__init__(color) self.width = width self.height = height def square(self): return self.width * self.height def info(self): print("Rectangle") print("Color: " + self.color) print("Width: " + str(self.width)) print("Height: " + str(self.height)) print("Square: " + str(self.square())) fig1 = Figure("green") print(fig1.info()) rect1 = Rectangle("red", 24, 45) print(rect1.info())

12

Page 13: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Создание и запуск первого проекта (web-приложения) Django

https://django.readthedocs.io/en/2.1.x/intro/tutorial02.html

Должны быть установлены Python и Pycharm Professional

13

Page 14: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Установите Python https://www.python.org/

14

Page 15: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Установите PyCharm Professional

Free individual licenses for students and faculty members

https://www.jetbrains.com/student/

15

Page 16: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Откройте Pycharm Professional

16

Page 17: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Документация по лекции

• https://www.jetbrains.com/help/pycharm/creating-and-running-your-first-django-project.html

17

Page 18: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Pycharm-Django Документация

18

Page 19: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Создайте новый проект

19

Page 20: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Зад

айте

пар

амет

ры

20

Page 21: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

21

Page 22: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Что мы видим в представлении проекта?

• mysite Каталог - это контейнер для вашего проекта. В представлении проекта он обозначен жирным шрифтом.

• manage.py Это утилита командной строки, которая позволяет вам взаимодействовать с вашим проектом Django. Обратитесь к документации Django для деталей.

• Вложенный каталог mysite- это актуальный пакет Python для вашего проекта. • mysite/__init__.py: Этот пустой файл сообщает Python, что этот каталог следует

рассматривать как пакет Python. • mysite/settings.py: Этот файл содержит конфигурацию для вашего проекта Django . • mysite/urls.py: Этот файл содержит объявления URL для вашего проекта Django . • mysite/wsgi.py: Этот файл определяет точку входа для WSGI-совместимых веб-

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

22

Page 23: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Что мы видим в представлении проекта?

• Вложенный каталог polls содержит все файлы, необходимые для разработки приложения Django (на данный момент эти файлы пусты): – Опять же, polls/_init_.py говорит Python, что этот каталог должен рассматриваться как

пакет Python. – polls/models.py В этом файле мы создадим модели для нашего приложения. – polls/views.py В этом файле мы создадим представления .

• templates каталог сейчас пуст. Он должен содержать файлы шаблона. • Вложенный каталог на данный момент migrations содержит только файл

пакета _init_.py, но в будущем он будет использоваться для распространения изменений, которые вы вносите в свои модели (добавление поля, удаление модели и т. д.) в схему базы данных. Прочитайте описание миграций здесь .

• Обратите внимание, что вы можете создавать столько приложений Django, сколько вам нужно. Чтобы добавить приложение в проект, запустите startapp задачу manage.py утилиты ( задача « Инструменты (Tools) | Выполнить (Run) manage.py» , затем введите startapp в консоли).

23

Page 24: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Чтобы увидеть

все файлы

проекта:

24

Page 25: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Конфигурирование базы данных • Теперь, когда основа проекта готова, сделаем некоторую подстройку. • Откройте для редактирования settings.py. Для этого выберите файл в окне инструмента

«Проект» и нажмите F4. Файл открывается в собственной вкладке в редакторе. • Укажите, какую базу данных вы собираетесь использовать в своем приложении. • Для этого найдите DATABASES переменную: нажмите Ctrl+F, и в поле поиска начните вводить

искомое слово. • Затем в 'ENGINE'строке добавьте имя вашей системы управления базами данных после

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

• В 'NAME'строке введите имя нужной базы данных, хотя она еще не существует.

25

Page 26: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Запуск сервера Django

• Поскольку мы сделали выбор sqlite3, нам не нужно определять другие значения (учетные данные пользователя, порт и хост).

• Давайте теперь проверим правильность наших настроек:

• запустите runserver задачу manage.py утилиты: – нажмите Ctrl+Alt+R и введите имя задачи в

manage.py консоли:

26

Page 27: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

27

Ctrl+Alt+R

Page 28: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

28

Page 29: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Создание моделей Откройте для редактирования файл models.py и обратите внимание, что оператор импорта уже существует. Затем введите следующий код:

from django.db import models

# the following lines added:

import datetime

from django.utils import timezone

class Question(models.Model):

question_text = models.CharField(max_length=200)

pub_date = models.DateTimeField('date published')

def __str__(self):

return self.question_text

def was_published_recently(self):

now = timezone.now()

return now - datetime.timedelta(days=1) <= self.pub_date <= now

was_published_recently.admin_order_field = 'pub_date'

was_published_recently.boolean = True

was_published_recently.short_description = 'Published recently?'

class Choice(models.Model):

question = models.ForeignKey(Question, on_delete=models.DO_NOTHING,)

choice_text = models.CharField(max_length=200)

votes = models.IntegerField(default=0)

def __str__(self):

return self.choice_text 29

Page 30: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Создание базы данных проекта

Нужно создать таблицы для новой модели. Для этой цели мы будем использовать Ctrl+Alt+R для вызова manage.py консоли. Первая команда для выполнения makemigrations polls:

30

Page 31: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

makemigrations polls

31

Созданные модели

Page 32: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Создан файл 0001_initial.py

32

Page 33: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

manage.py@mysite > sqlmigrate pools 0001 С

озд

ани

е т

абл

иц

в Б

Д (

1)

33

Page 34: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

manage.py@mysite > migrate

34

Со

здан

ие

таб

ли

ц в

БД

(2

)

Page 35: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Выполнение административных функций

Во-первых, создайте суперпользователя.

Для этого введите

createsuperuser команду в manage.py консоли, укажите свой

– адрес электронной почты и

– пароль

35

Page 36: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

В аdmin.py появится запись:

36

Page 37: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Подготовка конфигурации запуска / отладки

На главной панели инструментов щелкните селектор конфигураций запуска / отладки и затем выберите «Edit Configurations» (или выберите «Run| Edit Configurations» в главном меню):

37

Page 38: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

В диалоговом окне «Конфигурация запуска / отладки» присвойте этой конфигурации запуска / отладки имя (здесь оно есть mysite),

включите запуск приложения в браузере по умолчанию (установите флажок «Run browser» ) и укажите страницу сайта, которая будет открываться по умолчанию (вот эта страница http://127.0.0.1:8000/admin/)

38

Page 39: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Запуск админа сайта

Теперь, чтобы запустить приложение, нажмите Shift+F10

или щелкните на главной панели инструментов зеленую кнопку Run, чтобы открыть стандартную страницу входа на сайт Django

• Введите логин и пароль админа…

39

Page 40: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Страница администрирования

После входа отображается страница администрирования.

В ней есть раздел Аутентификация и авторизация (группы и пользователи) , но опросы недоступны. Почему так?

40

Page 41: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Что делать? • Нужно сообщить администратору,

что объекты Question имеют интерфейс администратора;

• для этого откроем файл polls/admin.py для редактирования (выберите его в представлении «Project» и нажмите F4) и введите следующий код:

41

from django.contrib import admin from .models import Question #this line added admin.site.register(Question)#this line added

В браузере обновите страницу и создайте опрос (+Add):

Page 42: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

42

Page 43: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Редактирование admin.py

• у каждого вопроса есть несколько вариантов ответов, но они по-прежнему недоступны.

• Снова откройте для редактирования файл polls/admin.py и измените его следующим образом:

43

Page 44: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

polls/admin.py from django.contrib import admin

from .models import Choice, Question

class ChoiceInline(admin.TabularInline):

model = Choice

extra = 4

class QuestionAdmin(admin.ModelAdmin):

fieldsets = [

(None, {'fields': ['question_text']}),

('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),

]

inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)

44

Page 45: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Теперь откройте и посмотрите страницу

изменения вопроса (Change)

и заполните поля

вариантов ответов - Save

45

Page 46: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Написание представлений views

Откройте файл polls/views.py для редактирования и введите следующий код Python:

46

from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.")

Page 47: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Затем создайте новый файл в polls каталоге с именем urls.py

и введите следующий код:

47

from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), ]

Page 48: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Затем откройте для редактирования файл mysite/urls.py (который PyCharm уже создал для вас) и добавьте URL для страницы индекса.

Вы должны ввести следующий код:

48

from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^pools/', include('pools.urls')), #this line added url(r'^admin/', admin.site.urls), ]

Page 49: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Теперь откройте страницу 127.0.0.1:8000/polls/

49

Page 50: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Добавим больше просмотров в файл polls/views.py

def detail(request, question_id):

return HttpResponse("You're looking at question %s." % question_id)

def results(request, question_id):

response = "You're looking at the results of question %s."

return HttpResponse(response % question_id)

def vote(request, question_id):

return HttpResponse("You're voting on question %s." % question_id)

50

Page 51: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Подключите новые представления в polls/urls.py

from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), ]

51

Page 52: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

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

52

Page 53: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Создание шаблонов Django. Замените содержимое polls/views.py следующим кодом:

from django.http import HttpResponse, HttpResponseRedirect

from django.shortcuts import get_object_or_404, render

from django.urls import reverse

from .models import Question, Choice

def index(request):

latest_question_list = Question.objects.order_by('-pub_date')[:5]

context = {'latest_question_list': latest_question_list}

return render(request, 'pools/index.html', context)

def detail(request, question_id):

question = get_object_or_404(Question, pk=question_id)

return render(request, 'pools/detail.html', {'question': question})

def results(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'pools/results.html', {'question': question}) def vote(request, question_id): question = get_object_or_404(Question, pk=question_id) try: selected_choice = question.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): return render(request, 'pools/detail.html', { 'question': question, 'error_message': "You didn't select a choice.", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('pools:results', args=(question.id,)))

53

Page 54: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Кликните по файлу html. Появится лампочка. Если вы щелкнете по лампочке или нажмете Alt+Enter, соответствующий файл шаблона будет создан в папке

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

54 Сделайте это для всех указанных html файлов в коде views.py

Page 55: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

На данный момент файл index.html пуст. Добавьте в него следующий код :

{% load staticfiles %}

<link rel="stylesheet" type="text/css" href="{% static 'pools/style.css' %}" />

{% if latest_question_list %}

<ul>

{% for question in latest_question_list %}

<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

{% endfor %}

</ul>

{% else %}

<p>No polls are available.</p>

{% endif %}

55

Page 56: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Создание таблицы стилей Как вы можете видеть в файле index.html, есть ссылка на таблицу стилей style.css, но его пока нет: Решите эту проблему следующим образом: 1. Создайте каталог. Для этого в представлении

«Project» выберите приложение pools и нажмите Alt+Insert.

2. В появившемся всплывающем меню выберите « Directory»

3. и укажите имя структуры каталога static/polls. 4. Затем создайте таблицу стилей в этом

каталоге. Для этого выберите самый внутренний каталог polls, нажмите Alt+Insert, выберите опцию « Stylesheet» и введите имя файла css в открывшемся диалоговом окне.

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

56

1-2 3

4

5

li a { color: green; }

Page 57: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Добавим url в файл pools/urls.py:

# ... urlpatterns = patterns('', # ... url(r'^(?P<pk>\d+)/$', PoolDetailView.as_view(), name='detail'), ) </pk>

57

Это значит, что представление PollDetailView будет вызываться, когда пользователь переходит, к примеру, по адресу: http://127.0.0.1:8000/polls/1

Page 58: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Добавим представление в файле polls/views.py:

# -*- coding: utf-8 -*- from django.shortcuts import render from django.views.generic import ListView, DetailView from .models import Question, Answer # ... class QuestionDetailView(DetailView): model = Question template_name = 'pools/detail.html'

58

Здесь мы создали класс представления, который расширяет встроенный в django класс DetailView, содержащий нужный функционал для отображения страницы.

Page 59: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

• Детальное представление опроса должно быть формой с радиокнопками,

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

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

59

Page 60: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Создадим шаблон с радиокнопками по адресу poоls/templates/pools/detail.html:

<h1>{{ question.title }}</h1> {% if error_message %} <p><strong>{{ error_message }}</strong></p> {% endif %} <form action="" method="post"> {% csrf_token %} {% for answer in question.answer_set.all %} <input type="radio" name="answer" id="answer{{ forloop.counter }}" value="{{ answer.id }}" /> <label for="answer{{ forloop.counter }}">{{ answer.answer }}</label> {% endfor %} <input type="submit" value="Голосовать" /> </form>

60

Page 61: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Перейдем по адресу http://127.0.0.1:8000/poоls/ и посмотрим результат:

61

Page 62: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Опрос «Какой серверный…»

62

Page 63: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

База данных проекта

63

Page 64: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

64

Page 65: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

65

Page 66: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

База данных

66

Page 67: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Для тестирования приложения введите код в test.py

import datetime from django.urls import reverse from django.test import TestCase from django.utils import timezone from .models import Question def create_question(question_text, days): time = timezone.now() + datetime.timedelta(days=days) return Question.objects.create(question_text=question_text, pub_date=time) class QuestionViewTests(TestCase): def test_index_view_with_no_questions(self): """ If no questions exist, an appropriate message should be displayed. """ response = self.client.get(reverse('index')) self.assertEqual(response.status_code, 200) self.assertContains(response, "No polls are available.") self.assertQuerysetEqual(response.context['latest_question_list'], [])

67

Page 68: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Решение проблем версий

• https://stackoverflow.com/questions/50116204/templatedoesnotexist-when-trying-to-override-template-name-in-detail-view

68

Page 69: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Рисуем графики

инструкция:

https://habr.com/post/126704/

69

Page 70: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

https://www.highcharts.com/demo

70

Page 71: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Django + Charts

• https://www.fusioncharts.com/dev/getting-started/django/create-charts-in-django-using-database

• https://github.com/sikrigagan/Django-Charts

71

Page 72: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

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

72 https://tproger.ru/news/python-developers-survey-2017/

Page 73: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

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

73 https://tproger.ru/news/python-developers-survey-2017/

Page 74: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

Проекты с кодом

• https://www.djangosites.org/with-source/

• https://bitbucket.org/pierangelo1982/fouremme_django/downloads/

Веб-приложение для электронной коммерции и блога с функциями аутентификации пользователя, PayPal Payments и Support Tickets.

• https://github.com/IreneG5/spss_online

74

Page 75: Python & Pycharm & Django - edu.runadin.miem.edu.ru/!!!_lec_2018_pdf/Django_Pycharm_Python_04.pdf · Python. Создание классов и объектов Создание класса

• Подробное видео по созданию блога: https://www.youtube.com/watch?v=IZqBTPmxoew

75