form.is_valid () always returns False in Django

Viewed 52

I got a strange bug. I am failing validation if I add an email field. If validation for only 1 username field, then everything works fine. Tell me please, what am I doing wrong?

file forms.py:

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField(required=False)


    def __init__(self, user, *args, **kwargs):
        self.user = user
        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",)

file views.py:

def get_context_data(self, request):
    self.object = get_object_or_404(Profile,slug=self.kwargs['slug'])
    ctx={}
    ctx['UserUpdateForm']=UserUpdateForm(request.POST if "UserUpdateForm" in request.POST else None,instance=request.user)           
    сtx['comments']=Comments.objects.filter(profile=self.object)
    return ctx

def post(self, request, *args, **kwargs):
    if request.method=='POST':
        if "UserUpdateForm" in request.POST:
            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()
                obj=Profile.objects.get(user__username=user.username)
                return HttpResponseRedirect(reverse_lazy('profile',kwargs={'slug': obj.slug},))
    return render(request,self.template_name,self.get_context_data(request))
1 Answers

You construct your form with an extra parameter user:

class UserUpdateForm(forms.ModelForm):
    
    def __init__(self, user, *args, **kwargs):
        # …

so that means that the first parameter when you construct the form is the user. You thus should pass a user:

form=UserUpdateForm(request.user, request.POST)

or if you want to edit the user object:

form=UserUpdateForm(request.user, request.POST, instance=request.user)

it however does not make much sense to pass the user, since as far as one can see, you never use the .user attribute in your form.

Related