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

Joe*_*iak 2 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
Run Code Online (Sandbox Code Playgroud)

mar*_*dev 6

请改用内置UserChangeForm的。

表格.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')
Run Code Online (Sandbox Code Playgroud)

视图.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})
Run Code Online (Sandbox Code Playgroud)