form.is_valid在Django中始终返回False

问题描述

我遇到了一个奇怪的错误。如果添加电子邮件字段,我将无法通过验证。如果仅对1个用户名字段进行验证,则一切正常。请告诉我,我在做什么错了?

文件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",)

文件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,**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))

解决方法

您可以使用额外的参数user来构造表单:

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

,这意味着构造表单时的第一个参数是用户。因此,您应该通过一个用户:

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

,或者如果您要编辑用户对象:

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

但是,通过用户并没有多大意义,因为就目前所见,您永远不会在表单中使用.user属性。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...