问题描述
我遇到了一个奇怪的错误。如果添加电子邮件字段,我将无法通过验证。如果仅对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
属性。