vault backup: 2026-05-30 19:03:22
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
---
|
||||
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>`.
|
||||
Reference in New Issue
Block a user