Django 01 - Hexlet Flashcards
Что представляет собой manage.py?
Скрипт с командами для управления проектом
Минимум для создания страницы
Маршрут. Определяет адрес конкретной страницы или набора страниц на сайте. Маршрут связывает эти адреса с конкретным обработчиком, который будет вызван при запросе этих страниц
Контроллер. Слой кода, в котором расположены обработчики страниц сайта. Они анализируют запрос и формируют ответ, который фреймворк отправляет пользователю
Шаблон. Специальный файл, который используется, чтобы формировать HTTP-ответ
Маршрут
хранятся в файле urls.py.
переменная urlpatterns — список маршрутов сайта.
Функция path(route, view)
Функция path(route, view)
Первым параметром она принимает адрес запрашиваемой страницы или паттерн, который описывает группу страниц.
Вторым параметром передается обработчик или встраиваемый urls.py другого приложения. Обработчики запросов в Django называют view — на жаргоне джангистов «вьюха».
Контроллер, функция render
Она формирует HTML на основе указанного шаблона и использует при рендеринге (составлении страницы) данные из словаря context.
Как соотносятся маршруты и конкретные адреса?
Один маршрут – много адресов
Что содержит шаблон?
Логику вывода и HTML
Как правильно определить маршрут /users
path('users/', views.users)
Что делает settings.INSTALLED_APPS
Этот список содержит перечень всех Django applications, которые подключены к текущему проекту. Встроенный загрузчик шаблонов (Template Loader) ищет их в поддиректориях с именем templates во всех подключенных приложениях.
Создание приложения
django-admin startapp <app_name>
Регистрация созданного приложения в apps.py
# hexlet_django_blog/article/apps.py class ArticleConfig(AppConfig): ... name = 'hexlet_django_blog.article' # <- изменяем эту строчку
Обязательно ли в приложении создавать urls.py?
По умолчанию в приложении не генерируется модуль urls.py. Дело в том, что приложение может и не быть настолько большим, чтобы потребовался отдельный набор правил маршрутизации. Такие небольшие приложения прописывают в urls.py уровнем выше.
Как соединить urls.py приложения и urls.py проекта?
Использовать include:path('articles/', include('hexlet_django_blog.article.urls')),
С этого момента все пути, которые начинаются с “articles/”, будут перенаправляться в hexlet_django_blog.article.urls
Что представляет собой приложение в Django?
Самостоятельное веб-приложение, которое можно переиспользовать
Пакет с модулями описания моделей и вьюх со своими шаблонами и роутингом
Какая команда создает новое приложение?
django-admin startapp app
Как подключить приложение к основному пакету?
- Задать имя приложения в файле apps.py
- Добавить имя приложения в список INSTALLED_APPS в файле настроек
Как загрузчик шаблонов ищет шаблоны?
Загрузчик учитывает положение приложения в списке settings.INSTALLED_APPS и загружает шаблоны соответственно.
На что влияет порядок подключений приложений?
С помощью управления порядком подключения приложений можно переопределять шаблоны одних приложений шаблонами из других
Какие шаблоны проекта стоит хранить в отдельной директории в корне проекта?
Все шаблоны проекта, которые используются только в нем.
Как следует поддерживать порядок в директории шаблонов проекта?
Использовать поддиректории и хорошие имена.
Куда нужно добавить директорию шаблонов проекта?
Директорию нужно добавить в settings.TEMPLATES.DIRS.
Где следует хранить шаблоны для приложений, которые планируется использовать повторно?
Внутри соответствующей директории templates нужно иметь поддиректорию с именем приложения и все шаблоны располагать в ней.
Как передавать данные в шаблон?
Данные передаются в шаблон с помощью контекста, который представляет собой словарь. Когда мы вызываем render(request, ‘template.html’, context={}), мы передаем этот самый словарь в качестве аргумента.
Можно ли хранить шаблоны приложений в директории самих приложений?
Да. Необходимо установить для параметра APP_DIRS значение True
Какие шаблонизаторы встроены в Django?
Jinja2
DjangoTemplates
Что допустимо делать в шаблоне?
Использовать циклы
Использовать условные конструкции
Пример for loop в шаблоне
{% for user in users %} <p>This is user {{ user.id }}</p> {% endfor %}
Как расширяются шаблоны?
{% extends "base.html" %}
Трехуровненый подход к наследованию шаблонов
- Создание base.html шаблона, который содержит основной внешний вид сайта
- Создание base_SECTIONNAME.html шаблонов для каждого раздела сайта, например, base_article.html, base_news.html. Эти шаблоны расширяют base.html и включают в себя стили для конкретных разделов
- Создание отдельного шаблона для каждого типа страницы, например, новостной статьи или записи в блоге. Эти шаблоны расширяют соответствующий шаблон раздела
Виды представлений в Django
Представления-функции — view functions
Представления-классы — class based views
Регистрация class-based view
Регистрируется представление-класс с помощью метода класса as_view. Выглядит регистрация так:
urlpatterns = [
…
path(‘’, IndexView.as_view()),
…
Какие объекты принимают представления-функции?
Объект класса HttpRequest
От какого класса наследуются представления-классы?
От класса django.views.View
Пример динамического маршрута
path('users/<int:user_id>/pets/<int:pet_id>/med_info/', med_info_view),
Обратные маршруты или reverse
Чтобы была возможность для любого маршрута всегда получить правильный путь, нужно произвести операцию, обратную маршрутизации — у Django есть функции reverse и reverse_lazy. Они позволяют получить путь по имени маршрута. Поэтому маршруты, которые нужно обращать, необходимо поименовать (задать уникальное имя)
Пример использования reverse
Когда маршрут поименован, можно получить путь вызовом вида reverse('pet_med_info', kwargs={'user_id': 42, 'pet_id': 101})
reverse_lazy
Функция reverse_lazy нужна, когда путь нужно получить на этапе инициализации программы, например, при описании class based views
Когда применять reverse и reverse_lazy?
reverse_lazy используем в атрибутах классов, а в теле вьюх и шаблонах — reverse. Последняя работает быстрее, но только с готовой картой маршрутов.
Как подключить набор urlpatterns из приложения проекта?
С помощью функции include() из модуля django.urls
Как генерируются имена таблиц?
Имена таблиц автоматически генерируются с помощью объединения имени приложения (article) и имени модели в нижнем регистре — article
Отменить все миграции приложения
python manage.py migrate article zero
За что отвечает ORM в приложении?
Отображение базы данных на сущности приложения
Бизнес-логику
Отображение сущностей приложения на базу данных
Выберите верные утверждения про понятие “модель” в ORM
Модель связана с таблицей в базе данных
Модель начинает работать тогда, когда создана и выполнена миграция, которая описывает таблицу для этой модели
Mодель в MVC — это не то же самое, что и модель, как сущность ORM
Как правильно выполнять любые изменения в базе данных?
Любое изменение — новая миграция
В какой момент изменение модели зафиксируется в базе данных?
В момент вызова метода save()
Как правильно удалить сущность из базы данных?
obj.delete()
Получение переменной окружения
import os SECRET_KEY = os.environ['SECRET_KEY']
Минусы хранения переменных окружения
Переменные загружаются только из окружения
Необходимо обрабатывать исключения KeyError
Необходимо конвертировать типы вручную
Альтернатива хранению переменных окружения
Для простоты конфигурации Django есть сторонняя библиотека python-dotenv. Она позволяет загружать переменные не только из окружения, но и из специального файла .env, который находится в корне проекта. Этот файл не хранится в репозитории
Настройка dot-env
#settings.py from dotenv import load_dotenv # Импортируем environ load_dotenv() # Загрузка переменных окружения из файла .env --- import os SECRET_KEY = os.getenv('SECRET_KEY') DEBUG = os.getenv('DEBUG', False)
Частью чего являются механизм «переменные окружения»?
Операционной системы
Создание суперпользователя
python manage.py createsuperuser
Регистрация модели в админке
from django.contrib import admin from .models import Article admin.site.register(Article)
Добавление поиска в админку
from .models import Article class ArticleAdmin(admin.ModelAdmin): search_fields = ['name', 'body'] admin.site.register(Article, ArticleAdmin)
Регистрация модели в админке с помощью декоратора
from .models import Article @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): search_fields = ['name', 'body']
Добавление отображаемых колонок и фильтров в админке
@admin.register(Article) class ArticleAdmin(admin.ModelAdmin): list_display = ('name', 'timestamp') # Перечисляем поля, отображаемые в таблице списка статей search_fields = ['name', 'body'] list_filter = (('timestamp', DateFieldListFilter),) # Перечисляем поля для фильтрации
Какой метод использовать предпочтительнее: get_object_or_404 или get?
get_object_or_404. В большинстве ситуаций сайт должен отдавать страницу 404, если что-то отсутствует. В первую очередь это касается страниц сущностей
Может ли в качестве идентификатора в маршруте использоваться что-то, отличное от первичного ключа в базе данных?
Да. Фреймворку без разницы что там. Данные, которые передаются через URL, зависят только от программиста
Получить заполненную модель, но не сохранять ее
comment = form.save(commit=False) # Получаем заполненную модель comment.content = check_for_spam(form.data['content']) comment.save()
В данном примере мы при помощи commit=False говорим Django, что данные пока сохранять не нужно, и получаем объект нашей модели. После дополнительной обработки модели ее необходимо сохранить с помощью вызова метода .save().
Как Django работает с формами?
Через встроенные механизмы для генерации и обработки формы
Как происходит генерация HTML-кода формы?
Экземпляр класс формы уже содержит HTML-код формы, достаточно его вывести в шаблоне как переменную
Можно ли автоматически создать форму для модели?
Можно унаследовать класс формы от ModelForm и указать модель
Как проверить данные формы?
Достаточно вызвать метод .is_valid() для автоматической проверки формы
Как сохраняются данные формы, наследованные от ModelForm?
Вызвать метод .save()
Как узнать возникшие ошибки при валидации?
При возникновении ошибки при валидации внутри формы создается словарь error, который содержит ошибки
Нужно ли создавать новый класс формы для обновления, если он уже имеется для создания?
Нет, можно повторно использовать класс формы для создания
Как заполнить форму данными?
form = ArticleForm(instance=Article.objects.get(id=article_id))
Как обновить данные модели?
Достаточно вызвать у обновленной формы .save()
Зачем нужно подтверждение удаления?
Чтобы предотвратить случайное удаление данных пользователем или поисковой системой при анализе сайта
Нужно ли определять отдельный путь для удаления данных?
Да. Это нужно делать для каждого действия