Salivanch
Salivanch

Reputation: 77

func form.is_valid() return all time False

I have a form that takes "username" from the User model and my own "email" field. I want to change this data for the User model. At first glance everything seems to work fine, the name changes and the mail is the same. But if I only change the mail and I don't touch the username, I get an error: "A user with this name already exists.

file views.py:

form=UserUpdateForm(request.POST)
if form.is_valid():
    user=User.objects.get(username=self.request.user)
    user.username=form.cleaned_data.get('username')
    user.email=form.cleaned_data.get('email')
    user.save()

file forms.py:

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField(required=False)
    def __init__(self,  *args, **kwargs):
        super(UserUpdateForm, self).__init__(*args, **kwargs)
        if 'label_suffix' not in kwargs:
            kwargs['label_suffix'] = '*'
        self.fields['username'].widget = forms.TextInput(attrs={'class':'input-text'})
        self.fields['email'].widget = forms.EmailInput(attrs={'class':'input-text'})
    class Meta:
        model = User
        fields = ("username","email",)
    def clean_email(self):
        cleaned_data = super(UserUpdateForm,self).clean() 
        email=cleaned_data.get('email')
        return email

Upvotes: 0

Views: 34

Answers (1)

JPG
JPG

Reputation: 88619

From the doc,

A subclass of ModelForm can accept an existing model instance as the keyword argument instance; if this is supplied, save() will update that instance. If it’s not supplied, save() will create a new instance of the specified model

If you are updating the data, you have to pass the instance to the form as,

# on updationg
form = UserUpdateForm(data= request.POST, instance=your_mode_instance)

Since you are not passing the instance for the second time, Django thinks that the operation is a row insert instead of row update

Upvotes: 1

Related Questions