2013-11-15 10 views
9

私はDjangoプロジェクトに取り組んでいます。ここでユーザーは自分のユーザー名と名字を1つのフォームで変更できます。 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がある場合モデルオブジェクトにバインドされている場合、モデルオブジェクト自体である 'instance'という属性があります。その場合は

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

は、フォームメソッドからログインしているユーザーにアクセスすることができ、そして、あなたの検証メソッドは、このようなものになることができます:あなたのビューでは、ときrequest.method == 'POST'、あなたはおそらく、このようにフォームのインスタンスを作成しています:それはあなたが.getメソッドを持つすべてのユーザー情報を取得しようとした場合よりも、自分のデータベースに速くクエリを発行するために

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方法を使用することを検討してください。そして、コードがあまりにも少ないクリーナーを取得します。

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 

必要に応じてValidationErrorをを上げたとき、あなたはまたthese guidelinesに従うことができます。

このコードは現在テストできませんので、何か問題がある場合はお詫びします。

+0

ありがとう、これは私が探していたものです。 – lukas

+0

Heyyy @lukasは 'if 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}) 
関連する問題