2013-11-15 31 views
9

我正在開發一個Django項目,用戶可以在其中以一種形式更改他們的用戶名以及他們的名和姓。在forms.py中,我試圖找出用戶是否存在。如果是這樣,它應該顯示一個錯誤。問題是,如果用戶想要改變他的名字和姓氏並在輸入中留下他的用戶名,則會引發驗證錯誤。顯然,該用戶名已經存在。有沒有辦法檢查它是否等於當前登錄用戶的用戶名並避免顯示錯誤?檢查用戶名是否存在於Django中

class ChangeNameForm(forms.ModelForm): 
    username = forms.CharField(max_length=30) 
    first_name = forms.CharField(max_length=255) 
    last_name = forms.CharField(max_length=255) 

    def clean_username(self): 
     username = self.cleaned_data['username'] 

     try: 
      user = User.objects.get(username=username) 
     except user.DoesNotExist: 
      return username 
     raise forms.ValidationError(u'Username "%s" is already in use.' % username) 

謝謝。

回答

22

當ModelForms是綁定到一個模型對象,他們有一個名爲「實例」的屬性,它是模型對象本身。在你看來,當request.method == 'POST',你可能創建表單實例是這樣的:

form = ChangeNameForm(request.POST, instance=request.user) 

如果是這樣的話,你可以從表單方法訪問登錄的用戶,以及您的驗證方法可以是這樣的:

def clean_username(self): 
    username = self.cleaned_data['username'] 
    try: 
     user = User.objects.exclude(pk=self.instance.pk).get(username=username) 
    except User.DoesNotExist: 
     return username 
    raise forms.ValidationError(u'Username "%s" is already in use.' % username) 

考慮使用.exists方法,它發出一個更快的查詢到您的數據庫比,如果你嘗試檢索所有與.get方法的用戶信息。和代碼變得乾淨了一點太:

def clean_username(self): 
    username = self.cleaned_data['username'] 
    if User.objects.exclude(pk=self.instance.pk).filter(username=username).exists(): 
     raise forms.ValidationError(u'Username "%s" is already in use.' % username) 
    return username 

或者,您也可以按照these guidelines提高ValidationError時。

我現在無法測試此代碼,所以如果有任何問題,我很抱歉。

+0

謝謝你,這正是我一直在尋找的。 – lukas

+0

Heyyy @lukas也可以做'如果User.objects.filter(username = username).count()' – wonderwhy

0

這是我設法使它工作(假設你已經登錄的用戶):

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', 'first_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}) 
相關問題