Files
SecondBrain/90 Library/Programming/Python/Django: Работа с формами и CUD.md
T
2026-05-30 19:08:23 +03:00

82 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
status: seed
type: concept
tags: [django, forms, crud, validation, modelform]
created: 2026-05-30
updated: 2026-05-30
title: "Django: Работа с формами и CUD"
source: ["[[lec5-django_cud_form.pdf]]"]
---
# Django: Формы и CUD
**CUD (Create, Update, Delete)** — операции изменения данных. Django предоставляет мощную подсистему форм для их реализации.
## Типы форм
1. **`forms.Form`**: Для общих задач (поиск, обратная связь), не привязанных к моделям.
2. **`forms.ModelForm`**: Автоматическая генерация полей на основе модели.
```python
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
fields = ['name', 'tagline']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control'})
}
```
---
## Жизненный цикл формы в представлении
```python
def contact_view(request):
if request.method == "POST":
form = ContactForm(request.POST)
if form.is_valid():
# Данные очищены и доступны в form.cleaned_data
data = form.cleaned_data
# Действие (сохранение или отправка email)
return redirect('success')
else:
form = ContactForm()
return render(request, 'contact.html', {'form': form})
```
---
## Валидация и очистка данных
- **`is_valid()`**: Запускает процесс проверки.
- **Автоматическая очистка**: Превращает текст в типы Python (например, строку в `datetime`).
- **`clean_<fieldname>()`**: Валидация конкретного поля.
- **`clean()`**: Валидация всей формы (сравнение полей).
---
## Generic Editing Views (CBV для CUD)
Django предоставляет готовые классы для CRUD:
- **CreateView**: Создание объекта.
- **UpdateView**: Редактирование (требует `pk` в URL).
- **DeleteView**: Удаление (требует подтверждения через POST).
**Пример:**
```python
class BlogCreateView(CreateView):
model = Blog
form_class = BlogForm
template_name = "blog/blog_form.html"
success_url = reverse_lazy('blog_list')
```
## Отображение в шаблоне
- `{{ form.as_p }}` — в параграфах.
- `{{ form.as_table }}` — в строках таблицы.
- **Ручное управление:**
```html
{% for field in form %}
{{ field.label_tag }} {{ field }}
{{ field.errors }}
{% endfor %}
```
*Важно:* Не забывайте про `{% csrf_token %}` внутри тега `<form>`.