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

82 lines
2.8 KiB
Markdown

---
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>`.