После set_password еще как минимум save надо сделать. Через админку поменяй парлоь, чтобы точно быть уверенным, что он верный.
Ну и вот этот кусок выглядит странно,
if username is None:
username = email
авторизация же по username идет, а если ты тут email подставляешь
Такой код позволяет отправить пост запрос в котором нет указанных полей и ты об это не узнаешь.
username = data.get('username', None)
email = data.get('email', None)
password = data.get('password', None)
Хотя бы для теста ассерты вставь. Может верстальщик там намутил че, поля переименовал.