我正在尝试为我的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
答案 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不应该自动检查用户模型字段是否存在不存在用户。