func form.is_valid返回所有时间为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

ModelForm的子类可以接受现有的模型实例作为关键字参数实例;如果提供了此参数,则save()将更新该实例。如果未提供,则save()将创建指定模型的新实例

如果您要 更新 数据,则必须将实例传递给表单,

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

由于您第二次未通过 实例 ,因此Django认为该操作是 行插入 而不是行更新

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...