2009-07-29 16 views
40

是否有可能在表單類中獲取request.user數據?我想清理一個電子郵件地址,以確保它是唯一的,但如果它是當前用戶的電子郵件地址,那麼它應該通過。以Django的形式獲取請求數據

這就是我目前擁有的創建新用戶的好工具,但是如果我想編輯一個用戶,我會遇到他們的電子郵件無法驗證的問題,因爲它已經被使用了。如果我可以使用request.user.email檢查它是他們的電子郵件,那麼我將能夠解決我的問題,但我不知道如何做到這一點。

class editUserForm(forms.Form): 
    email_address = forms.EmailField(widget=forms.TextInput(attrs={'class':'required'})) 

    def clean_email_address(self): 
     this_email = self.cleaned_data['email_address'] 
     test = UserProfiles.objects.filter(email = this_email) 
     if len(test)>0: 
      raise ValidationError("A user with that email already exists.") 
     else: 
      return this_email 

回答

56

正如ars和Diarmuid指出的那樣,您可以將request.user傳遞到表單中,並將其用於驗證電子郵件。然而,Diarmuid的代碼是錯誤的。該代碼實際上應:

from django import forms 

class UserForm(forms.Form): 
    email_address = forms.EmailField(widget = forms.TextInput(attrs = {'class':'required'})) 

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

    def clean_email_address(self): 
     email = self.cleaned_data.get('email_address') 
     if self.user and self.user.email == email: 
      return email 
     if UserProfile.objects.filter(email=email).count(): 
      raise forms.ValidationError(u'That email address already exists.') 
     return email 

然後,在你看來,你可以用它像這樣:

def someview(request): 
    if request.method == 'POST': 
     form = UserForm(request.POST, user=request.user) 
     if form.is_valid(): 
      # Do something with the data 
      pass 
    else: 
     form = UserForm(user=request.user) 
    # Rest of your view follows 

請注意,您應該通過request.POST作爲關鍵字參數,因爲你的構造希望「用戶」成爲第一個立場。

這樣做,您需要通過user作爲關鍵字參數。您可以將request.POST作爲位置參數或關鍵字參數(通過data=request.POST)。

+3

代碼示例在這個答案中比在我的更好,所以我刪除了我的upvoted這一個,雖然你會希望==而不是=在clean_email_address方法中的if子句。 – Prairiedogg 2009-07-30 02:43:06

+0

固定。感謝您的支持:) – elo80ka 2009-07-30 03:43:49

0

不是我所知道的。處理這種情況的一種方法是,您的Form類的__init__採用可選的電子郵件參數,它可以將其存儲爲屬性。如果在創建表單時提供,則可以在驗證期間使用它來進行比較。

3

大家知道,使用Django 1.4和基於類的CreateView和UpdateView,每個模型表單上都會填充一個self.instance,它允許您比較POST郵件和當前用戶的電子郵件。

下面是一個代碼示例,用混入

class EmailUniqueMixin(object): 
    """ 
    Ensure each User's email is unique 
    on the form level 
    """ 
    def clean_email(self): 
     email = self.cleaned_data['email'] 
     existing_email = User.objects.filter(email=email).exclude(pk=self.instance.id) 
     if existing_email: 
      raise forms.ValidationError('That email address already exists') 
     else: 
      return email 
24

這裏的方式使用通用的看法時,得到您的形式向用戶:

在視圖中,通過request.user使用get_form_kwargs形式:

class SampleView(View): 
    def get_form_kwargs(self): 
     kwargs = super(SampleView, self).get_form_kwargs() 
     kwargs['user'] = self.request.user 
     return kwargs 

在表單中,您將收到user__init__功能:

class SampleForm(Form): 
    def __init__(self, user, *args, **kwargs): 
     super(SampleForm, self).__init__(*args, **kwargs) 
     self.user = user