如何将请求传递给django表单?

时间:2017-02-25 22:32:59

标签: django django-forms

如何将请求传递给django表单?

我正在创建一个django更新个人资料表单,用户可以在其中更改个人资料电子邮件。我想检查表单中的电子邮件是否属于已登录用户,如果没有,那么我想检查其他用户是否使用此电子邮件,然后再将其设置为新用户电子邮件。

这是我的代码,此 self.request.user.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

所以也许有更好的解决方案来解决我的问题?

2 个答案:

答案 0 :(得分:4)

由于您使用的是cbv,因此可以使用FormMixin中的get_form_kwargs函数。

看起来像这样:

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

答案 1 :(得分:3)

表单没有Request对象。您需要在构造函数中手动传递当前登录的用户。您的表单应如下所示:

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
    ...

在视图中实例化表单:

def edit_profile(request):
    form = UserProfileForm(user=request.user)
    ...