Clean will be called too late, I believe. This is done here so that the super() call will find the correct model instance: https://github.com/django/django/blob/master/django/forms/models.py#L1168

This should be wrapped in a try/accept though.