Validating and saving a user profile, using fat model vs. view code
Yes, using MVC frameworks, or in case of Django modified term MTV (Model-Template-View) you will often hear the expression "Fat models, thin controllers". I do think it is a good idea and the business logic should be put into the model.

In your case the method create_candidate_profile is performing a database operation. More important it changes the database and persists data to it.

Data persistence should be done in the model. So, yes, I'd say the second version is definitely the way to go.

In future you might want to add another possibility for creating candidate profile, maybe through a custom command. Then you can make use of this model method:

User.create_candidate_profile(
    name, mobile_phone, notification_type, password
)


The only line in the code I'd slightly change is the following:

activation_key = self.kwargs['activation_key']


should become:

activation_key = self.kwargs.get('activation_key', 'deafult value')


That is just for the case that self.kwargs doesn't have the key activation_key, so you can pass some default value, maybe an empty string ''.