如何将请求传递到django表单?
如何将请求传递到django表单 我正在创建一个django更新配置文件表单,用户可以在其中更改配置文件电子邮件。我想检查表单中的电子邮件是否属于已登录用户,如果不是,则在将其设置为新用户电子邮件之前,我想检查此电子邮件是否被其他用户使用 这是我的代码,这个self.request.user.email不起作用:如何将请求传递到django表单?,django,django-forms,Django,Django Forms,如何将请求传递到django表单 我正在创建一个django更新配置文件表单,用户可以在其中更改配置文件电子邮件。我想检查表单中的电子邮件是否属于已登录用户,如果不是,则在将其设置为新用户电子邮件之前,我想检查此电子邮件是否被其他用户使用 这是我的代码,这个self.request.user.email不起作用: def clean_email(self): email = self.cleaned_data.get("email") owns_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
因此,也许有更好的解决方案来解决我的问题?表单没有
请求
对象。您需要在构造函数中手动传递当前登录的用户。您的表单应该如下所示:
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
...
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
在视图中实例化表单:
def edit_profile(request):
form = UserProfileForm(user=request.user)
...
表单没有
请求
对象。您需要在构造函数中手动传递当前登录的用户。您的表单应该如下所示:
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
...
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
在视图中实例化表单:
def edit_profile(request):
form = UserProfileForm(user=request.user)
...
由于您使用的是cbv,因此可以使用FormMixin中的函数 它可能看起来像这样:
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
...
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
由于您使用的是cbv,因此可以使用FormMixin中的函数 它可能看起来像这样:
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
...
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
您使用的是哪种视图?是cbv还是fbv?我使用的是基于类的视图。您使用的是哪种视图?它是cbv还是fbv?我使用基于类的视图。最简单的解决方案。只要记住在实例化类时将其交给用户即可。最简单的解决方案。只要记住在实例化该类时将其交给用户即可。