是否可以在表单类中获取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)
if len(test)>0:
raise ValidationError("A user with that email already exists.")
else:
return this_email
答案 0 :(得分:63)
正如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'作为第一个位置参数。
这样做,您需要将user
作为关键字参数传递。您可以将request.POST
作为位置参数或关键字参数(通过data=request.POST
)传递。
答案 1 :(得分:29)
以下是使用通用视图时在表单中获取用户的方法:
在视图中,使用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
答案 2 :(得分:4)
您知道,使用Django 1.4和基于通用类的CreateView和UpdateView,每个模型表单上都会填充一个self.instance,它允许您比较POSTed电子邮件与当前用户电子邮件。
以下是使用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
答案 3 :(得分:0)
不是我知道的。处理此问题的一种方法是让Form类的__init__
采用可选的电子邮件参数,该参数可以存储为属性。如果在表单创建时提供,它可以在验证期间使用它进行您感兴趣的比较。