Auto | arch-x1: 2026-06-05 13:29:15
This commit is contained in:
@@ -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 }}
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user