--- status: seed type: concept tags: [django, forms, crud, validation, modelform] created: 2026-05-30 updated: 2026-05-31 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_()`**: Валидация конкретного поля. - **`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 %}` внутри тега `
`.