2017-02-25 4 views
0

Djangoフォームにリクエストを渡すには?Djangoフォームにリクエストを渡すには?

プロファイルの電子メールを変更できるdjangoアップデートプロファイルフォームを作成しています。フォームの電子メールがログインしているユーザーに属しているかどうかを確認したい場合は、新しいユーザーの電子メールとして設定する前にこの電子メールが他のユーザーによって使用されているかどうかを確認したい。ここで

は私のコードであり、このself.request.user.emailは動作しません:

def clean_email(self): 
     email = self.cleaned_data.get("email") 
     owns_email = (email != self.request.user.email) 
     if User.objects.filter(email__icontains=email).exists() and owns_email: 
      raise forms.ValidationError("This email aldready registered.") 
     return email 

だから多分私の問題を解決するためのよりよい解決策はありますか?

+1

使用しているビューのどのような?それはcbvかfbvですか? – Fred

+0

私はクラスベースのビューを使用しています。 – django11

答えて

2

あなたはCBVを使用しているので、あなたがFormMixinからget_form_kwargs機能を使用することができますフォームは次のようになります。それはこのような何かを見ることができる

class UserProfileUpdateView(UpdateView): 
... 
    def get_form_kwargs(self): 
    '''This goes in the Update view''' 
     kwargs = super(UserProfileUpdateView, self).get_form_kwargs() #put your view name in the super 
     user = self.request.user 

     if user: 
      kwargs['user'] = user 

     return kwargs 

その後、あなたのフォームクラスは、あなたの上記のコードに基づいて、このような何か、になります。

class UserProfileUpdateForm: 
... 
    def __init__(self, *args, **kwargs): 
     if kwargs.get('user'): 
      self.user = kwargs.pop('user', None) 
     super(UserProfileUpdateForm, self).__init__(*args,**kwargs) 

    def clean_email(self): 
     email = self.cleaned_data.get("email") 
     owns_email = (email != self.user.email) 
     if User.objects.filter(email__icontains=email).exists() and owns_email: 
      raise forms.ValidationError("This email already registered.") 
     return email 
2

フォームにRequestオブジェクトがありません。現在ログインしているユーザーをコンストラクタに手動で渡す必要があります。ビューでフォームをインスタンス化

class UserProfileForm(forms.Form): 
    user = None 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') 
     super(UserProfileForm, self).__init__(*args, **kwargs) 

    ... 
    def clean_email(self): 
     email = self.cleaned_data['email'] 
     owns_email = (email != self.user.email) 
     if User.objects.filter(email__icontains=email).exists() and owns_email: 
      raise forms.ValidationError('This email already registered.') 
     return email 
    ... 

def edit_profile(request): 
    form = UserProfileForm(user=request.user) 
    ... 
関連する問題