Django用户帐户更新 - 忽略“具有此用户名的用户已存在”

时间:2013-11-24 06:04:09

标签: django account

我正在尝试为我的django网站创建一个编辑帐户页面。我正在尝试使用我的注册表单稍作修改,因为信息基本上都是一样的。我遇到的问题是当用户点击更新时,django甚至会检查唯一的用户名,如果他们的用户名是相同的,则会返回以下错误。如果他们没有改变它,它应检查该字段值是否等于登录的用户名并跳过它。

  

“具有此用户名的用户已存在”

到目前为止,我已经覆盖了clean方法,通过request.user传递给表单,并检查登录的用户名是否与字段用户名相同。看看其他堆栈溢出问题,似乎人们只是del self._errors ['username']但是我得到了一个关键错误。 self._errors甚至没有实例化。我也尝试将“Unique”属性设置为false,但它仍然给我错误。我迷路了所以任何帮助都会受到赞赏。

我的表单类:

class updateAccount(forms.ModelForm):
        username = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Username'}))
        email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Email Address'}))
        first_name = forms.CharField(max_length=100, required=True, widget=forms.TextInput(attrs={'placeholder': 'First Name'}))
        last_name = forms.CharField(max_length=100, required=True, widget=forms.TextInput(attrs={'placeholder': 'Last Name'}))      

        class Meta:
            model = User
            fields = ('username','email','first_name','last_name')
            exclude = ('password',)

        def __init__(self, *args, **kwargs):
            self.request = kwargs.pop("request")
            super(updateAccount, self).__init__(*args, **kwargs)

        def clean(self):
            if self.request.user.username == self.cleaned_data.get('username'):
                self.fields['username'].required = False

            super(updateAccount, self).clean()

            return self.cleaned_data

        def save(self, commit=True):
            user = super(updateAccount, self).save(commit=False)
            if commit:
                user.save()
            return user

2 个答案:

答案 0 :(得分:4)

使用内置UserChangeForm代替。

forms.py

from django.contrib.auth.forms import UserChangeForm
from django.contrib.auth.models import User

class MyUserChangeForm(UserChangeForm):
    def __init__(self, *args, **kwargs):
        super(MyUserChangeForm, self).__init__(*args, **kwargs)
        del self.fields['password']

    class Meta:
        model = User
        fields = ('username','email','first_name','last_name')

views.py

def home(request):
    if request.method == 'POST':
        form = MyUserChangeForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
    else:
        form = MyUserChangeForm(instance=request.user)

    return render(request, 'change_user.html', {"form": form})

答案 1 :(得分:1)

无论我是继承UserChangeForm,AuthenticationForm还是forms.ModelForm,我都有同样的错误。所以我只是切换到从forms.Form继承并将它的字段绑定到views.py中的模型,并且它以这种方式工作。多一点代码然而错误消失了。对我来说,似乎Django试图在这种情况下有点过于聪明 - forms.ModelForm不应该自动检查用户模型字段是否存在不存在用户。