The comment below needs editing since it's technically wrong (`message_dict` is now the rendered version of the error messages).

I also like that `full_clean` and `clean_fields` have the same handling of `exclude` and `errors`:

```
        if exclude is None:
            exclude = []

        errors = {}
```

Should I just clear the blank line, it might even be accidental actually.