func form.is_valid() return 始终为 False
func form.is_valid() return all time False
我有一个表单,它从用户模型和我自己的“电子邮件”字段中获取“用户名”。我想为用户模型更改此数据。乍一看一切似乎都很好,名称改变了,邮件是一样的。但是,如果我只更改邮件而不触及用户名,则会收到错误消息:“具有此名称的用户已存在。
文件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()
文件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
来自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
如果您正在更新数据,您必须将实例传递给表单,
# on updationg
form = UserUpdateForm(data= request.POST, <b>instance=your_mode_instance</b>)
因为你不是第二次传递实例,Django认为这个操作是行插入而不是行更新
我有一个表单,它从用户模型和我自己的“电子邮件”字段中获取“用户名”。我想为用户模型更改此数据。乍一看一切似乎都很好,名称改变了,邮件是一样的。但是,如果我只更改邮件而不触及用户名,则会收到错误消息:“具有此名称的用户已存在。
文件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()
文件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
来自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
如果您正在更新数据,您必须将实例传递给表单,
# on updationg
form = UserUpdateForm(data= request.POST, <b>instance=your_mode_instance</b>)
因为你不是第二次传递实例,Django认为这个操作是行插入而不是行更新