以Django的forms获取请求数据

是否有可能得到request.user数据在表单类? 我想清理一个电子邮件地址,以确保它是唯一的,但如果它是当前用户的电子邮件地址,那么它应该通过。

这是我目前拥有的创build新用户的好工具,但是如果我想编辑一个用户,我会遇到他们的邮件无法validation的问题,因为它已经被使用了。 如果我可以使用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 

正如ars和Diarmuid所指出的那样,您可以将request.user传递request.user您的表单,并将其用于validation电子邮件。 然而,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作为关键字parameter passing,因为您的构造函数需要“user”作为第一个位置参数。

这样做,你需要传递user作为关键字参数。 您可以传递request.POST作为位置参数或关键字参数(通过data=request.POST )。

使用通用视图时,可以通过以下方式来获取用户的表单:

在视图中,使用get_form_kwargsrequest.user传递给表单:

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

在表单中,您将使用__init__函数接收user

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

只要知道Django 1.4和基于类的CreateView和UpdateView,就会在每个模型表单上填充一个self.instance,它允许您比较POST电子邮件和当前用户的电子邮件。

这里是一个代码示例,使用mixin

 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 

不是我所知道的。 处理这个问题的方法之一是你的Form类的__init__带一个可选的email参数,它可以存储为一个属性。 如果在表单创build时提供,则可以在validation期间使用它来进行您感兴趣的比较。