2013-11-24 77 views
2

我試圖爲我的django網站創建編輯帳戶頁面。我試圖用稍微修改我的註冊表格,因爲信息基本上都是一樣的。我遇到的問題是當用戶點擊更新時,django甚至會檢查唯一的用戶名,如果他們的用戶名保持不變,則返回以下錯誤。如果他們不改變它,它應該檢查該字段值是否等於登錄的用戶名並跳過它。Django用戶帳戶更新 - 忽略「此用戶名已存在的用戶」

「用戶使用該用戶名已經存在」

到目前爲止,我已經覆蓋了乾淨的方法,通過request.user傳遞給表單,並檢查登錄的用戶名是一樣的字段用戶名。查看其他堆棧溢出問題,似乎人們只是刪除self._errors ['用戶名'],但我得到一個關鍵的錯誤。 self._errors甚至沒有實例化。我也嘗試設置「唯一」屬性爲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 

回答

3

使用內置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}) 
+0

我也試過。我剛剛複製並粘貼了您的代碼,但仍然顯示錯誤「用戶使用此用戶名已存在」。 – user2508385

+0

@ user2508385這很奇怪,我使用相同的代碼,我沒有得到這個錯誤..你使用什麼django版本? – mariodev

+0

我明白了,我沒有在post.py中設置我的views.py中的實例。 – user2508385

0

我有同樣的錯誤,不管我是否繼承UserChangeForm,AuthenticationForm或forms.ModelForm。所以我簡單地轉換爲從forms.Form繼承,並綁定它的字段以在views.py中建模,並且以這種方式工作。多一點的代碼,但錯誤消失。對我來說,似乎Django試圖在這種情況下過於聰明 - forms.ModelForm不應該自動檢查用戶模型字段是否存在用戶。