Auto | arch-x1: 2026-06-05 13:29:15

This commit is contained in:
Dmitry
2026-06-05 13:29:15 +03:00
parent 8e206fed3a
commit 1acb87897f
6 changed files with 763 additions and 36 deletions
@@ -8,7 +8,7 @@ tags:
- cbv
- fbv
created: 2026-05-30
updated: 2026-05-31
updated: 2026-06-05
source:
- '[[lec2-django_lec_urls_views_templates-1.pdf]]'
- '[[lec3-django_cbv-1.pdf]]'
@@ -76,6 +76,15 @@ from django.urls import reverse
url = reverse("blog:post_detail", kwargs={"pk": 1})
```
`path()` обычно принимает:
- `route` — строка маршрута;
- `view` — функция или `ClassView.as_view()`;
- `kwargs` — дополнительные аргументы view;
- `name` — имя маршрута для `{% url %}` и `reverse()`.
`app_name` задаёт namespace приложения. Тогда маршрут вызывается как `blog:post_detail`, а не просто `post_detail`.
---
## Представления (Views)
@@ -94,6 +103,12 @@ def index(request):
return render(request, "app/index.html", {"items": latest_items})
```
У `render()` первым аргументом должен идти `request`:
```python
return render(request, "index.html", context)
```
```python
from django.shortcuts import get_object_or_404, render
@@ -140,6 +155,35 @@ class PostDetailView(DetailView):
context_object_name = "post"
```
Если в `ListView` не указать ни `model`, ни `queryset`, Django не поймёт, какие объекты показывать, и выдаст ошибку.
Стандартные имена в контексте:
- `ListView``object_list` и дополнительно `<model>_list`, например `post_list`;
- `DetailView``object` и дополнительно `<model>`, например `post`.
Методы, которые часто переопределяют:
- `get_queryset()` — изменить список объектов;
- `get_object()` — изменить получение одного объекта;
- `get_context_data()` — добавить данные в шаблон.
При переопределении `get_context_data()` обычно сначала вызывают базовую логику:
```python
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Посты"
return context
```
Паджинация в `ListView` включается через `paginate_by = 10`. В шаблоне появляются `page_obj`, `paginator`, `is_paginated`.
Шаблоны по умолчанию:
- `ListView` ищет `<app>/<model>_list.html`;
- `DetailView` ищет `<app>/<model>_detail.html`.
```python
# blog/urls.py
from django.urls import path
@@ -167,6 +211,8 @@ urlpatterns = [
Шаблон получает контекст из view. Например, если view передала `{"posts": posts}`, в шаблоне доступна переменная `posts`.
Если обратиться к переменной, которой нет в контексте, Django-шаблон обычно выведет пустую строку, а не Python-ошибку.
```html
{% for post in posts %}
<article>
@@ -247,3 +293,27 @@ STATICFILES_DIRS = [BASE_DIR / "static"]
```bash
python manage.py collectstatic
```
## Простыми словами для экзамена
FBV — view как функция. CBV — view как класс с готовой логикой.
Маршрут соединяет URL и view:
```python
path("find/", views.find, name="find")
```
В шаблоне ссылка на именованный маршрут создаётся так:
```html
<a href="{% url 'myapp:find' %}">Поиск</a>
```
Шаблонные переменные пишутся через `{{ variable }}`. Шаблонные теги пишутся через `{% tag %}`. Комментарии пишутся через `{# comment #}`.
Ключ словаря в шаблоне читается через точку:
```django
{{ user_data.name }}
```