以Django形式获取请求数据 [英] get request data in Django form
问题描述
可以在form类中获取request.user数据吗?我想清理一个电子邮件地址,以确保它是唯一的,但如果它是当前用户的电子邮件地址,那么它应该通过。
这是我目前有哪些工作非常适合创建新用户,但如果我想编辑一个用户,我遇到他们的电子邮件没有验证的问题,因为它已经被采用了。如果我可以使用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)
如果len(测试)> 0:
raise ValidationError(具有该电子邮件的用户已存在)
else:
返回this_email
正如ars和Diarmuid所指出的,你可以通过 request.user
到您的表单,并用于验证电子邮件。然而,Diarmuid的代码是错误的。代码实际上应该是:
from django import forms
pre>
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')
如果self.user和self.user.email ==电子邮件:
返回电子邮件
如果UserProfile.objects .filter(email = email).count():
raise forms.ValidationError(你的电子邮件地址已经存在了。)
return email
然后,在您看来,您可以这样使用:
def someview(request):
如果request.method =='POST':
form = UserForm(request.POST,user = request.user )
如果form.is_valid():
#执行某些数据
pass
else:
form = UserForm(user = request.user)
#您的视图的其余部分遵循
请注意,您应该将request.POST作为关键字因为你的构造函数期望'user'作为第一个位置参数。
这样做,你需要通过
用户
作为关键字参数。您可以通过request.POST
作为位置参数或关键字参数(通过data = request.POST
) 。Is it possible to get request.user data in a form class? I want to clean an email address to make sure that it's unique, but if it's the current users email address then it should pass.
This is what I currently have which works great for creating new users, but if I want to edit a user I run into the problem of their email not validating, because it comes up as being taken already. If I could check that it's their email using request.user.email then I would be able to solve my problem, but I'm not sure how to do that.
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
解决方案As ars and Diarmuid have pointed out, you can pass
request.user
into your form, and use it in validating the email. Diarmuid's code, however, is wrong. The code should actually read: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
Then, in your view, you can use it like so:
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
Note that you should pass request.POST as a keyword argument, since your constructor expects 'user' as the first positional argument.Doing it this way, you need to pass
user
as a keyword argument. You can either passrequest.POST
as a positional argument, or a keyword argument (viadata=request.POST
).这篇关于以Django形式获取请求数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!