2.8 KiB
2.8 KiB
status, type, tags, created, updated, title, source
| status | type | tags | created | updated | title | source | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| seed | concept |
|
2026-05-30 | 2026-05-31 | Django: Формы и CUD |
|
Django: Формы и CUD
CUD (Create, Update, Delete) — операции изменения данных. Django предоставляет мощную подсистему форм для их реализации.
Типы форм
forms.Form: Для общих задач (поиск, обратная связь), не привязанных к моделям.forms.ModelForm: Автоматическая генерация полей на основе модели.
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
fields = ['name', 'tagline']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control'})
}
Жизненный цикл формы в представлении
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).
Пример:
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 }}— в строках таблицы.- Ручное управление:
{% for field in form %}
{{ field.label_tag }} {{ field }}
{{ field.errors }}
{% endfor %}
Важно: Не забывайте про {% csrf_token %} внутри тега <form>.