When should I use user.get_profile in django?
django, model, profile, python, view
Solution
The code works as you've written it, but because you don't pass an instance to your model it's a bit unusual, so it might take another Django developer a bit longer to work out what's going on.
The view you link to instantiates the model form with an instance, so that the existing profile values are displayed in the form. In your case, you'll get empty fields.
upform = UserProfileForm(instance=user.get_profile())
Because you don't provide an instance, saving would try to create a new `user_profile`, which we wouldn't want. That won't happen in your case, because you've made `user` the primary key, but that's a little unusual as well.
The main advantage of writing `user.get_profile()` is that you don't need to know which model is used for the user profile. If you are happy to hardcode `UserProfile` model in your code, you could put `instance=UserProfile.objects.get(user=user)` instead.
Problem
I saw another answer here and other places on the web that recommend using user.get_profile when extending the built-in django user. I didn't do that in the below example. The functionality seems to be working fine, but is there a downside for not using user.get_profile()? model ``` class UserProfile(models.Model): user = models.ForeignKey(User, primary_key=True) quote = models.CharField('Favorite quote', max_length = 200, null=True, blank=True) website = models.URLField('Personal website/blog', null=True, blank=True) class UserProfileForm(ModelForm): class Meta: model = UserProfile fields = ('quote', 'website') ``` view ``` @login_required def user_profile(request): user = User.objects.get(pk=request.user.id) if request.method == 'POST': upform = UserProfileForm(request.POST) if upform.is_valid(): up = upform.save(commit=False) up.user = request.user up.save() return HttpResponseRedirect('/accounts/profile') else: upform = UserProfileForm() return render_to_response('reserve/templates/edit_profile.html', locals(), context_instance=RequestContext(request)) ```