Fork me on GitHub

Python and Django

Полезные ссылки

ниже конспект книги 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

social