2017-02-25 78 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,您可以使用get_form_kwargs函數從FormMixin。

它可能是這個樣子:

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) 
    ...