2013-11-15 30 views
9

Ich arbeite an einem Django-Projekt, bei dem Benutzer ihre Benutzernamen zusammen mit ihrem Vor- und Nachnamen in einem Formular ändern können. In forms.py versuche ich herauszufinden, ob der Benutzer existiert. Wenn ja, sollte ein Fehler angezeigt werden. Das Problem besteht darin, dass wenn ein Benutzer seinen Vor- und Nachnamen ändern möchte und seinen Benutzernamen in der Eingabe belässt, ein Validierungsfehler auftritt. Offensichtlich existiert dieser Benutzername bereits. Gibt es eine Möglichkeit, zu überprüfen, ob es dem Benutzernamen des aktuell angemeldeten Benutzers entspricht, und den Fehler nicht anzuzeigen?Überprüfen, ob der Benutzername in Django existiert

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) 

Vielen Dank.

Antwort

22

Wenn ModelForms sind An ein Modellobjekt gebunden, haben sie ein Attribut namens 'instance', welches das Modellobjekt selbst ist. Ihrer Ansicht nach, wenn request.method == 'POST', sind die Schaffung Sie wahrscheinlich die Form Beispiel wie folgt aus:

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

Wenn das der Fall ist, können Sie den angemeldeten Benutzer aus den Formular Methoden zugreifen können, und Ihre Validierungsmethode so etwas wie das sein kann :

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) 

Betrachten Sie die .exists Methode, denn es ist als eine schnellere Abfrage der Datenbank gibt, wenn Sie versuchen, alle die Benutzerinformationen mit dem .get Methode abzurufen. Und der Code wird ein wenig sauberer zu:

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 

Optional können Sie auch these guidelines folgen können, wenn die Validation erhöhen.

Ich kann diesen Code jetzt nicht testen, also entschuldige ich mich, wenn etwas falsch ist.

+0

Danke Mann, das ist genau das, was ich gesucht habe. – lukas

+0

Heyyy @lukas kann auch 'if User.objects.filter (username = username) .count()' – wonderwhy

0

Dies ist, wie ich es geschafft, um es Arbeit zu machen (vorausgesetzt, Sie in ein angemeldeter Benutzer haben):

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}) 
Verwandte Themen