Django edit user profile

manosim picture manosim · Mar 21, 2014 · Viewed 31.2k times · Source

I'm trying to create an "Edit Profile" form in the fronted. What happens is that my form(i'm not 100% sure) tries to create a user instead of finding the current user and update his profile. So I think that's the issue. Checked many questions here but none was clear enough. The fields I'm trying to edit are email, first name and last name. (Also I would like to add uda

forms.py

class UpdateProfile(forms.ModelForm):
    username = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    first_name = forms.CharField(required=False)
    last_name = forms.CharField(required=False)

    class Meta:
        model = User
        fields = ('username', 'email', 'first_name', 'last_name')

    def clean_email(self):
        username = self.cleaned_data.get('username')
        email = self.cleaned_data.get('email')

        if email and User.objects.filter(email=email).exclude(username=username).count():
            raise forms.ValidationError('This email address is already in use. Please supply a different email address.')
        return email

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']

        if commit:
            user.save()

        return user

views.py

def update_profile(request):
    args = {}

    if request.method == 'POST':
        form = UpdateProfile(request.POST)
        form.actual_user = request.user
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('update_profile_success'))
    else:
        form = UpdateProfile()

    args['form'] = form
    return render(request, 'registration/update_profile.html', args)

Answer

patsweet picture patsweet · Mar 21, 2014

You are very close. When you are instantiating the form, you need to pass the User object you are modifying as the instance argument.

From the docs:

A subclass of ModelForm can accept an existing model instance as the keyword argument instance; if this is supplied, save() will update that instance.

In your code, it would look like:

form = UpdateProfile(request.POST, instance=request.user)
if form.is_valid():
    ...

You can checkout more info here: https://docs.djangoproject.com/en/1.6/topics/forms/modelforms/#the-save-method