если не передаать в форму data или передавать None
то флаг is_bound будет False:
self.is_bound = data is not None or files is not None
и соответственно форма всегда будет не валидна!
def is_valid(self):
"""
Returns True if the form has no errors. Otherwise, False. If errors are
being ignored, returns False.
"""
return self.is_bound and not self.errors
Если вы передадите в качестве data request.POST или просто пустой словарь, то это уже будет обычная форма, которая будет валидироваться согласно определению формы.
Также замечание по поводу
initial есть подозрение, что вы его рассматриваете как значения по умолчанию - если поле не передано в data то будет взято значение из initial, так вот оно так не работает, поля initial используются при генерации html отображения формы, но не при валидации.
З.Ы, примеры кода из django1.9