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

2.8 KiB

status, type, tags, created, updated, title, source
status type tags created updated title source
seed concept
django
forms
crud
validation
modelform
2026-05-30 2026-05-30 Django: Работа с формами и CUD
lec5-django_cud_form.pdf

Django: Формы и CUD

CUD (Create, Update, Delete) — операции изменения данных. Django предоставляет мощную подсистему форм для их реализации.

Типы форм

  1. forms.Form: Для общих задач (поиск, обратная связь), не привязанных к моделям.
  2. 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>.