Опять поймал себя на быстром «прими данные и сохрани», потом заметил инъекцию через пустой ввод и другие дыры. Признаться, разозлился — на свои же «быстрые» формы. Так добрался до нормальной валидации: не «сохранить что пришло», а «сначала проверить, а потом сохранить».

Нейтрально: форма Django собирает данные, валидирует их (обязательность, длина) и даёт методы сделать чище. Хороший признак зрелого junior — не сохранять в обход формы напрямую из request.POST.

from django import forms

class HabitForm(forms.Form):
    name = forms.CharField(max_length=120)
    minutes = forms.IntegerField(min_value=1, max_value=600)

    def clean_name(self):
        name = self.cleaned_data["name"].strip()
        if len(name) < 2:
            raise forms.ValidationError("Слишком короткое имя")
        return name

После вечера с формами захотелось переписать все «ручные» приёмы — они были школой, а не привычкой. Валидация перестала быть пустым словом, когда увидел её как барьер ДО сохранения, а не «потом где-нибудь проверим».