Полезные ссылки
- https://www.djangoproject.com/
- Настраиваем Django + virtualenv + nginx + gunicorn + PostgreSQL + memcached + letsencrypt на Ubuntu 16.04
- Всё, что вы хотели знать о фреймворке Django
- Best Practices в работе с моделями Django
- Class-based views — зачем и как использовать - пример view
- https://djbook.ru/rel1.7/topics/forms/
ниже конспект книги Django2.1 - практика создания веб-сайтов на Python. Дронов.
Установка Django
pip install django
Проект Django
django-admin startproject samplesite`
Структура проекта:
-
manage.py - модуль который совершает различные действия над преоктом
-
папка samplesite - пакет конфигурации
- settings.py - настройки проекта
- urls.py - модуль с маршрутами уровня проекта
- wsgi.py - модуль, связывающий преокт с веб-сервером
Отладочный сервер:
manage.py runserver
Приложения - отдельный фрагмент функциональности сайта.
Приложение это обычный пакет питон.
Создание нового приложения
manage.py startapp bboard
Структура приложений
- admin.py - модуль админ настроек и классов-редакторов
- apps.py - модуль с настройками приложения
- models.py - модуль с моделями
- tests.py - модуль с тестирующими процедурами
- views.py - модуль с контроллерами
Регистрация приложения в проекте:
в файле settings.py переменная INSTALLED_APPS перечисляются все приложения зарегистрированные в проекте и учавствующие в его работе.
INSTALLED_APPS = [
...
'bboard.apps.BboardConfig'
]
Контроллер - код, запускаемыйв ответ на поступление клиентского запроса, который содержит интернет-адрес опред. формата.
Контроллер может представлять собой контроллер-функкция или контроллер-класс.
модуль views.py - для хранения кода контроллеров.
Маршруты и маршрутизатор
- объявить связь адреса определнного формата с определенным контроллером - маршрут
- оформить все объявленные нами маршруты в виде списка маршрутов
urls.py - модуль в котором записываются маршруты уровня проекта
from bboard.views import index
urlpatterns = [
path('bboard', index),
...
]
Модели - это однозначное и исчерпывающее описание сущности, хранящейся в БД в виде класса Python.
Класс модели описывает таблицу БД, в которой будет хранится набор сущностей, и содер-т атрибуты класса.
models.py пакета приложения bboard запишем код:
Миграции - для формирования в БД всех требуемых моделью структур: таблиц, полей, индексов, правил и связей.
manage.py makemigrations bboard
- Посмотрим результирующий SQL код:
manage.py sqlmigrate bboard 0001
- Выполнение всех миграций всех приложений проекта:
manage.py migrate
Консоль Django
manage.py shell
Работа с моделями:
from bboard.models import Bb
b1 = Bb(title='Дaчa', content='Общество "Двухэтажники". Два этажа, кирпич, свет, газ, канализация', price=500000)
b1.save()
b1.pk # значение ключевого поля
Все классы моделей поддерживают атрибут класса objects - хранит диспетчер записей (экземпляр класса Manager ) - особая структура позволяющая манипулировать всей совокупностью имеющих в модели записей.
Bb.objects.create(title='Дoм', content='Трехэтажный, кирпич', price=50000000) # создает новую запись и сохраняет запись и возвр-ет в качестве результата
`# вывести записи
for b in Bb.objects.all(): print(b.pk, ': ', b.title)
Методы атрубута objects модели:
- all() - возвращает набор записей
- order_by() - сортирует записи по значению поля, чье имя указано в параметре
- filter() - выполняет фильтрацию записей по заданным критериям
- delete() - удаляет текущую запись
Шаблоны
по умолчанию шаблонизатор ищет все шаблоны в папках templates, вложенных в папки пакетов приложений. Сами файлы шаблонов веб старниц должны иметь расширение html.
Административный сайт Django
django.contrib.admin - приложение обеспечивает административный сайт django.
Чтобы успешно задействовать встроенные средства разграничения доступа django, нужно хотя бы один раз произвести операцию по выполнению миграций.
Создание суперпользователя:
manage.py createsuperuser
http://localhost:8000/admin - админ сайт
Чтобы любое приложение появилось в списке админ сайта, его нужно регистрировать - открыть модуль админ настроек admin.py пакета приложения bboard:
from .models import Bb
admin.site.register(Bb)
models.py в пакете bboard:
class Bb(models.Model):
title = models.CharField(max_length = 50, verbose_name='Товар')
class Meta:
verbose_name_plural = 'Объявления'
verbose_name = 'Объявление'
ordering = ['-published']
Редактор модели
Класс-редактор объявляется в admin.py пакета приложения.
class BbAdmin(admin.ModelAdmin):
list_display = ('title', 'content', 'price', 'published')
list_display_links = ('title', 'content')
search_fields = ('title', 'content', )
admin.site.register(Bb, BbAdmin)
Связи между моделями
добавим в models.py
class Rubric(models.Model):
name = models.CharField(max_length=20, db_index=True,
verbose_name='Название')
class Meta:
verbose_name_plural = 'Рубрики'
verbose_name = 'Рубрика'
ordering = ['name']`
Создадим связь "один-ко-многим" (запись Rubric будет связана с многими записями модели Bb) - для этого в Bb создадим поле rubric
rubric = models.ForeignKey('Rubric', null=True, on_delete = models.PROTECT,verbose_name='Рубрика')
Класс ForeignKey - поле внешнего ключа в котором будет харнится ключ записи из первичной модели.
Выполним генерирование миграций для внесения изменений в структуры БД:
manage.py makemigrations bboard
manage.py migrate
Зарегистрируем новую модель на админсайте в модуле admin.py:
from .models import Rubric
admin.site.register(Rubric)
Урл-параметры и параметризированные запросы
Обратное разрешение интернет-адресов
это мы указываем маршрут, формирующий нужный нам адрес, и если это параметризированный маршрут, значения URL-параметров, а django сам генерирует на основе всего этого правильный адрес.
Для этого нужно:
- модуль urls.py пакета приложения и исправим код, создающий набор маршрутов:
urlpatterns = [
path('<int:rubric_id>/', by_rubric, name = 'by_rubric'),
path('', index, name = 'index'),]
имя маршрута указывается в именованном параметре name функции path()
- используем для адреса в гиперссылках тегов шаблонизатора url:
<a href="/bboard/{{rubric.pk}}/">
замени на
<a href=" {% url 'by_rubric' rubric.pk %} ">
Формы, связанные с моделями
создать модуль forms.py пакета приложения:
from django.forms import ModelForm
from .models import Bb
class BbForm(ModelForm):
class Meta:
model = Bb
fields = ('title', 'content', 'price', 'rubric')
Контроллеры-классы
в модуле views.py в пакете приложения:
Модели: базовые инструменты
Интернет-адрес модели - интернет-адрес, указывающий на конкретную запись модели.
Способы формирования интернет-адрес:
- декларативный (описываем в настройках проекта в параметре ABSOLUTE_URL_OVERRIDES в виде словаря питон)
Например,
ABSOLUTE_URL_OVERRIDES = ( 'bboard.rubric': lambda rec: "/bboard/%s/ % rec.pk")
в код шаблона достаточно вставить вызов метода get_absolute_url():
<a href="{{ rubric.get_absolute_url }}"> {{ rubric.name }} </a>
- императивный - непосредственное переопределения метода get_absolute_url() в классе модели.
class Rubric(models.Model):
def get_absolute_url(self):
return "/bboard/%s/ " % self.pk